前市面上可用的数据源有
3
个
:c3p0, dbcp, bonecp
。对应一个数据源生产使用,主要注意以下几个点:
1.
性能
2.
自动重连
3.
安全,目前只有jboss app server内置的数据源支持数据库密码的加密。
以下为
c3p0
的配置
1
、
pool size config
,这个主要看你的应用以及数据库配置,来决定
min,max pool size;另外你也可以做一下性能测试,以寻找一个合适的数值
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="initialPoolSize"><value>10</value></property>
<property name="minPoolSize"><value>5</value></property>
<property name="maxPoolSize"><value>30</value></property>
<property ame="acquireIncrement"><value>5</value></property>
</bean>
参考:
http://www.mchange.com/projects/c3p0/index.html#basic_pool_configuration
2. statement pool size
(针对
PrepareStatement
)
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="maxStatements"><value>30</value></property>
<property name="maxStatementsPerConnection"><value>5</value></property>
</bean>
参考:
http://www.mchange.com/projects/c3p0/index.html#configuring_statement_pooling
3
、自动重连
如果在获取连接时抛出异常,
c3p0
会捕获此异常,进行重试。
此功能一般用于生产环境数据库维护时,切换主、备机引起的问题。
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="acquireRetryAttempts"><value>30</value></property>
<property name="acquireRetryDelay"><value>1000</value></property>
<property name="breakAfterAcquireFailur "><value>false</value></property>
</bean>
参考:http://www.mchange.com/projects/c3p0/index.html#configuring_recovery
4、安全性
在生产环境,访问数据库的密码都是经过加密的,你即使看到,也不能拿来用,那如何把这个加密的密码给c3p0用呢?
比如,实际数据的密码是pwd, 但配置文件里指定的却是b7220dfdfdf8;这就需要我们在生产环境模式下,去解码,把b7220dfdfdf8还原为pwd。
<bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<!-- c3p0数据源的一个专有属性,只可以存放密码和用户名,详情可以研究它的源码,开源的吗 -->
<property name="properties">
<bean class="com.common.DatasourcePropertiesFactory" factory-method="getProperties">
<constructor-arg type=" java.lang.String">
<value>${jdbc_password_encrypted}</value>
</constructor-arg>
<!-- 生产环境模式 ,才特殊处理加密密码-->
<constructor-arg type="java.lang.String">
<value>${production}</value>
</constructor-arg>
</bean>
</property>
</bean>
DatasourcePropertiesFactory的源码:
public class DatasourcePropertiesFactory {
private static final String PRODUCTION_MODE = "true";
private static final String PROP_PASSWORD = "password";
private static final String DEFAULT_SECURE_KEY = "secure key";
public static Properties getProperties(String pwd, String production) throws Exception {
Properties p = new Properties();
// production mode
if (PRODUCTION_MODE.equalsIgnoreCase(StringUtil.trim(production))) {
try {
p.setProperty(PROP_PASSWORD, decode(pwd));
} catch (Exception e) {
throw e;
}
}
return p;
}
//以下两个方法参考于jboss的实现
private static String encode(String secret) throws NamingException, NoSuchAlgorithmException, InvalidKeyException,
NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
byte[] kbytes = DEFAULT_SECURE_KEY.getBytes();
SecretKeySpec key = new SecretKeySpec(kbytes, "Blowfish");
Cipher cipher;
cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encoding = cipher.doFinal(secret.getBytes());
BigInteger n = new BigInteger(encoding);
return n.toString(16);
}
private static String decode(String secret) throws NoSuchPaddingException, NoSuchAlgorithmException,
InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
byte[] kbytes = DEFAULT_SECURE_KEY.getBytes();
SecretKeySpec key = new SecretKeySpec(kbytes, "Blowfish");
BigInteger n = new BigInteger(secret, 16);
byte[] encoding = n.toByteArray();
Cipher cipher = Cipher.getInstance("Blowfish");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decode = cipher.doFinal(encoding);
return new String(decode);
}
public static void main(String[] args) throws NamingException, InvalidKeyException, NoSuchAlgorithmException,
NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
String secret = "ca";
System.out.println(encode(secret));
}
}
---以下无内容。
分享到:
相关推荐
本文将深入解析如何在Java Web项目中配置与使用C3P0数据源连接池。 ### 一、C3P0简介 C3P0(Concurrent Data Source Pooling for Java)是一款开源的JDBC连接池实现,它提供了对JDBC资源进行统一管理的能力,通过...
**配置c3p0数据源详解** 在Java的Web应用中,数据库连接管理是一个至关重要的环节,有效地管理和控制数据库连接可以提高系统的性能和稳定性。c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范...
MySQL.C3p0配置动态数据源是Java开发中常见的数据库连接池管理技术,它结合了MySQL数据库驱动和C3p0连接池库,为应用程序提供高效、稳定的数据库连接管理。在进行这样的配置时,需要引入特定的依赖包,确保项目的...
配置 C3P0 数据源通常涉及以下几个步骤: 1. **引入依赖**:首先,你需要将 C3P0 的相关 JAR 包添加到项目的类路径中。例如,`c3p0-0.9.1.2.jar` 是核心库,`c3p0-0.9.1.2-jdk1.3.jar` 是针对 JDK 1.3 的版本,而 `...
在 Spring 中,C3P0 配置文件可以通过数据源实现。Spring 中,数据连接是通过数据源获得的。在 Spring 中,你可以通过 JNDI 获取应用服务器的数据源,也可以直接在 Spring 容器中配置数据源。此外,你还可以通过代码...
下面将详细介绍C3P0数据源以及如何在配置式开发中使用它。 首先,`c3p0-0.9.5.2.jar`是C3P0的核心库,包含了C3P0的数据源实现和其他相关类。这个版本是0.9.5.2,是一个稳定且功能丰富的版本,提供了许多配置选项来...
3. 初始化数据源:在应用启动时,根据配置信息创建C3P0数据源的实例。 4. 获取和归还连接:在需要操作数据库时,通过数据源的getConnection()方法获取连接;操作完成后,必须调用Connection的close()方法,将连接...
在你的博客文章(链接已提供)中,你应该会详细介绍如何集成C3P0,包括如何在代码中创建数据源,如何加载配置文件,以及如何在实际应用中使用连接池服务。通过这种方式,你可以避免频繁的数据库连接创建和关闭,提高...
2. **创建C3P0数据源**:在Java代码或配置文件(如Spring的`application.properties`或`context.xml`)中定义C3P0数据源。 ```java import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0...
除了资源文件配置外,C3P0也可以通过XML配置文件(如`c3p0-config.xml`)进行设置,这种方式更加灵活,可以针对不同的数据源设定不同的配置。例如: ```xml <class-name>...
**C3P0数据源配置** C3P0是一个JDBC连接池实现,支持JDBC3和JDBC2扩展规范。它是Hibernate的一部分,但也可以独立使用。配置C3P0需要添加`c3p0/c3p0-0.9.0.4.jar`到类路径。以下是一个配置Oracle数据源的例子: ``...
C3P0 是一个开源的 JDBC 连接池,它实现了数据源和 JNDI 绑定,支持 JMX 监控,提供了比 DBCP 和 Proxool 更优秀的性能和稳定性。C3P0 配置是通过一个 XML 文件(通常命名为 `c3p0-config.xml`)进行的,该文件包含...
在XML文件中,你可以定义数据源的JNDI名称,以及C3P0的相关配置属性。 6. **C3P0的使用** 在Java代码中,可以通过以下方式获取C3P0数据源: ```java ComboPooledDataSource cpds = new ComboPooledDataSource();...
C3P0 是一个开源的 JDBC 连接池,它实现了数据源和 JNDI 绑定,支持 JUnit 和 Jakarta 构架。在 Spring 框架中集成 C3P0,可以有效地管理数据库连接,提高系统的性能和稳定性。下面我们将详细介绍 Spring 配置 C3P0 ...
总结,Spring配置C3P0连接池涉及到添加依赖、在Spring配置文件中定义数据源bean以及配置C3P0的相关参数。通过这种方式,我们可以有效地管理和利用数据库连接,提高系统的稳定性和效率。在实际项目中,还需要根据具体...
技术分享:配置Spring数据源c3p0与dbcp
一个hibernate数据源的c3p0配置,希望对你有帮助
在使用Hibernate配置c3p0数据源时,我们需要引入`c3p0-jar`包,这个压缩包中的JAR文件包含了c3p0的所有相关类和库。在项目中,我们通常将这个JAR文件添加到类路径(ClassPath)中,以便于程序运行时能够找到并加载c3...