- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
好的,我在 Tomcat 5.5 的 server.xml 中有一个资源,用于数据库连接,如下所示:
<Resource name="jdbc/MyApp" auth="Container" type="com.mchange.v2.c3p0.ComboPooledDataSource" driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver" maxPoolSize="100" minPoolSize="5"
acquireIncrement="5"
user="username"
password="password"
factory="org.apache.naming.factory.BeanFactory"
jdbcUrl="jdbc:sqlserver://localhost:1433;databaseName=myDatabase;autoReconnect=true" />
有人试过扩展上面的 ComboPooledDataSource 吗?问题是数据库密码是明文形式。思路是先对密码进行加密,将加密后的 key 放在server.xml中。我有一个解密实用程序,因此我可以在尝试连接到数据库之前解密 key 。
我找到了 org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory 问题的示例解决方案,但我没有使用此连接池。我正在使用 C3P0。以前有人用 C3P0 试过这个吗?
最佳答案
是的,您不能扩展 com.mchange.v2.c3p0.ComboPooledDataSource
,因为它是公开的。这是我实现此目的的解决方法。
我扩展了 org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy
并将 com.mchange.v2.c3p0.ComboPooledDataSource
数据源作为构造函数参数传递。
这是我对上述数据源的hibernate.cfg.xml
配置:
<bean id="dataSource" class="MyDataSource">
<constructor-arg ref="c3p0DataSource" />
</bean>
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driver.className}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="acquireIncrement" value="${dataSource.acquireIncrement}" />
<property name="acquireRetryAttempts" value="${dataSource.acquireRetryAttempts}" />
<property name="acquireRetryDelay" value="${dataSource.acquireRetryDelay}" />
<property name="autoCommitOnClose" value="${dataSource.autoCommitOnClose}" />
<property name="breakAfterAcquireFailure" value="${dataSource.breakAfterAcquireFailure}" />
<property name="checkoutTimeout" value="${dataSource.checkoutTimeout}" />
<property name="debugUnreturnedConnectionStackTraces"
value="${dataSource.debugUnreturnedConnectionStackTraces}" />
<property name="forceIgnoreUnresolvedTransactions"
value="${dataSource.forceIgnoreUnresolvedTransactions}" />
<property name="idleConnectionTestPeriod" value="${dataSource.idleConnectionTestPeriod}" />
<property name="initialPoolSize" value="${dataSource.initialPoolSize}" />
<property name="maxAdministrativeTaskTime" value="${dataSource.maxAdministrativeTaskTime}" />
<property name="maxConnectionAge" value="${dataSource.maxConnectionAge}" />
<property name="maxIdleTime" value="${dataSource.maxIdleTime}" />
<property name="maxIdleTimeExcessConnections" value="${dataSource.maxIdleTimeExcessConnections}" />
<property name="maxPoolSize" value="${dataSource.maxPoolSize}" />
<property name="maxStatements" value="${dataSource.maxStatements}" />
<property name="maxStatementsPerConnection" value="${dataSource.maxStatementsPerConnection}" />
<property name="minPoolSize" value="${dataSource.minPoolSize}" />
<property name="numHelperThreads" value="${dataSource.numHelperThreads}" />
<property name="propertyCycle" value="${dataSource.propertyCycle}" />
<property name="testConnectionOnCheckin" value="${dataSource.testConnectionOnCheckin}" />
<property name="testConnectionOnCheckout" value="${dataSource.testConnectionOnCheckout}" />
<property name="unreturnedConnectionTimeout" value="${dataSource.unreturnedConnectionTimeout}" />
</bean>
Mine jdbc.properties file:
jdbc.driver.className=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.url=xxxxx
jdbc.username=xxx
jdbc.password=xxxxxxxxx #Encrytped password here
jdbc.hibernate.dialect=org.hibernate.dialect.SQLServerDialect
hibernate.show_sql=false
hibernate.hbm2ddl.auto=update
dataSource.acquireIncrement=3
dataSource.acquireRetryAttempts=30
dataSource.acquireRetryDelay=60000
dataSource.autoCommitOnClose=false
dataSource.breakAfterAcquireFailure=false
dataSource.checkoutTimeout=0
dataSource.debugUnreturnedConnectionStackTraces=false
dataSource.forceIgnoreUnresolvedTransactions=false
dataSource.idleConnectionTestPeriod=0
dataSource.initialPoolSize=10
dataSource.maxAdministrativeTaskTime=0
dataSource.maxConnectionAge=0
dataSource.maxIdleTime=0
dataSource.maxIdleTimeExcessConnections=0
dataSource.maxPoolSize=10
dataSource.maxStatements=0
dataSource.maxStatementsPerConnection=0
dataSource.minPoolSize=10
dataSource.numHelperThreads=3
dataSource.propertyCycle=0
dataSource.testConnectionOnCheckin=false
dataSource.testConnectionOnCheckout=false
dataSource.unreturnedConnectionTimeout=0
Mine extended class where I decrypt the password before passing the datasource to transaction Proxy wrapper.
import javax.sql.DataSource;
import org.jasypt.util.text.BasicTextEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
import com.csc.emms.common.EMMSConstraints;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class MyDataSource extends TransactionAwareDataSourceProxy
{
private static char[] appName =
{
'B', 'I', 'N', 'G', 'O', 'D', 'I', 'N', 'G', 'O'
};
@Autowired
// Inject your class by constructor
MyDataSource(ComboPooledDataSource dataSource)
{
super.setTargetDataSource(decryptPassword(dataSource));
}
private DataSource decryptPassword(ComboPooledDataSource dataSource)
{
dataSource.setPassword(decode(dataSource.getPassword()));
return dataSource;
}
private String decode(String encodedPassword)
{
BasicTextEncryptor decoder = new BasicTextEncryptor();
decoder.setPasswordCharArray(appName);
return decoder.decrypt(encodedPassword);
}
private String encode(String password)
{
BasicTextEncryptor encoder = new BasicTextEncryptor();
encoder.setPasswordCharArray(appName);
return encoder.encrypt(password);
}
}
Hope this resolved your issue.
关于java - 如何扩展 c3p0 ComboPooledDataSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4198513/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如标题中所说,我的 ComboPooledDataSource 在每次请求时创建一个新的数据库连接,并且从不重用或释放连接。我预先对 PreparedStatements、ResultSets 和
我正在使用 com.mchange.v2.c3p0.ComboPooledDataSource 作为 Spring MVC Web 项目中 Oracle DB 的数据源. 这是我的此类的 bean 属
我正在为我的网络应用程序实现一些运行时报告,该应用程序使用 c3p0 的 ComboPooledDataSource。我想知道是否有一种方法可以以编程方式获取迄今为止池中的最大连接数。与 Thread
据我了解,C3P0 是最终类,不能使用 Mockito 进行模拟。我也明白我不应该模拟我的数据库调用。但是,我的类中有一些需要 C3P0 ComboPooledDataSource 的方法,我想模
好的,我在 Tomcat 5.5 的 server.xml 中有一个资源,用于数据库连接,如下所示: 有人试过扩展上面的 ComboPooledDataSource 吗?问题是数据库密码是明文形式。
该方法可能的返回值是什么? 为空? 无效连接? 问题是我应该检查返回的连接是否不为空或者是否有效?或者我应该捕获 SQLException?如果没有抛出SQLException,返回的连接是否始终有效
c3p0 ComboPooledDataSource 有两种设置凭据的方法:setUser 和 setPassword。我的软件将定期轮换数据库访问的用户名和密码,我担心在调用 setUser 和 s
这是我第一次在 hibernate 状态下使用 ComboPooledDataSource,但我认为我的配置有问题,所以当我调用 DAO 从数据库中检索所有数据时,这不会返回任何结果。 GenView
这是我的 c3p0 配置代码...当应用服务器启动时,我正在初始化来自 dbDef(数据库定义表)的数据源 SessionFactory sessionFactoryByServer; Connect
我目前有一个 server.xml 配置,其中包含以下内容 出于显而易见的原因,我要求不再允许用户名/密码以明文形式出现在 server.xml 文件中。 我在网上看了一些书,发现了 How to
我正在使用池数据源(msaccess 数据库)通过我制作的应用程序更新本地数据库(客户端使用 h2 数据库)。我遇到的问题是在提交请求时说“插入用户(名称,代码)值(Me,hfd5255fd4);”应
我需要一个 SQLite 只读 C3P0 ComboPooledDataSource。我在这里找到的这段代码 ( Set SQLite connection properties in c3p0 co
当我收到错误消息时,我应该在哪里指示类依赖性: 找不到类“com.mchange.v2.c3p0.ComboPooledDataSource” 找不到类“org.springframework.jdb
我有一个连接到 Oracle 数据库的非常简单的 Hibernate 项目。 如果由于某种原因它无法连接到 Oracle(例如网络中断),它会在一分钟内失败。这发生在构建数据源时,似乎也发生在尝试与数
有人可以让我摆脱痛苦并解释为什么会发生这种情况以及如何解决它。 一个 tomcat 数据源 查找 ComboPooledDataSource ds = (ComboPooledDataSource)
问题: 程序使用 com.mchange.v2.c3p0.ComboPooledDataSource 连接到 Sybase 服务器 程序依次执行 runSQL1() 和 runSQL2() 两个方法
我在我的项目中配置了以下 c3p0 设置。但是在执行jar文件时,我发现“没有可写属性”。请告诉我如何解决这个问题。 配置:- dataSource.setClassName("com.mchange
截至最近,我的 API 在从 Web 应用程序请求 PUT 时一直产生以下错误。由于某种奇怪的原因,它只发生在 PUT 上。有时它会起作用(垃圾邮件点击运行此 PUT 请求的项目),而有时它会失败并出
我制作了一个简单的 Java EE 应用程序,但在连接数据库时遇到问题。在 Eclipse 中,一切工作正常,但是当我在 Intellij 中尝试相同的操作时,就会出现错误。 package db;
我是一名优秀的程序员,十分优秀!