使用BasicDataSource配置连接池时无法设置clientProgramName的问题求助
实现DB2连接池并配置clientProgramName的可行方案
我们的应用目前用Apache Commons DBCP的BasicDataSource配置DB2连接池,尝试过两种方式设置clientProgramName都未生效:
- 直接在Bean中配置
clientProgramName="JavaClientApp" - 通过
connectionProperties="clientProgramName='JavaClientApp'"传递属性
改用com.ibm.db2.jcc.DB2SimpleDataSource时该属性能正常生效,但这个数据源没有连接池功能,以下是两种同时满足连接池和clientProgramName配置的解决方案:
方案一:使用DB2自带的连接池数据源
DB2官方提供了自带连接池实现的com.ibm.db2.jcc.DB2ConnectionPoolDataSource,它支持直接配置clientProgramName,同时具备连接池功能,配置示例如下:
<bean id="dataSource" class="com.ibm.db2.jcc.DB2ConnectionPoolDataSource" destroy-method="close"> <property name="driverClassName" value="com.ibm.db2.jcc.DB2Driver"/> <property name="url" value="your_db2_url"/> <property name="user" value="your_username"/> <property name="password" value="your_password"/> <property name="clientProgramName" value="JavaClientApp"/> </bean>
该数据源由IBM官方维护,对DB2兼容性更好,能直接识别clientProgramName属性,无需额外处理。
方案二:保留DBCP并通过连接初始化SQL设置
如果必须使用Apache Commons DBCP的BasicDataSource,可以通过connectionInitSqls属性,在每次从连接池获取连接时执行DB2系统存储过程设置客户端程序名,配置示例:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.ibm.db2.jcc.DB2Driver"/> <property name="url" value="your_db2_url"/> <property name="username" value="your_username"/> <property name="password" value="your_password"/> <property name="connectionInitSqls"> <list> <value>CALL SYSPROC.SET_CLIENT_INFO('APPLICATIONNAME', 'JavaClientApp')</value> </list> </property> </bean>
这种方式通过DB2内置存储过程SET_CLIENT_INFO设置应用名称,每次连接取出时都会执行该SQL,确保客户端程序名生效。
另外补充:若尝试用connectionProperties传递属性,需去掉单引号,改为connectionProperties="clientProgramName=JavaClientApp",但部分DBCP版本可能无法正确将该属性传递给DB2驱动,因此优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Sanjay
相关产品推荐
相关产品推荐

