The standard way of configuring a data source for RSLib’s Data Hibernate Library is to use the driver’s DataSource implementation as shown here:
1
2
3
4
5
6
7
8
9
10
| <?xml version="1.0" encoding="UTF-8"?>
<dbconfig>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<datasource class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource">
<property name="url">jdbc:mysql://db-host:3306/db-name</property>
<property name="user">db-user</property>
<property name="password">db-password</property>
</datasource>
</dbconfig> |
<?xml version="1.0" encoding="UTF-8"?>
<dbconfig>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<datasource class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource">
<property name="url">jdbc:mysql://db-host:3306/db-name</property>
<property name="user">db-user</property>
<property name="password">db-password</property>
</datasource>
</dbconfig>
However, this setup will result in creating a new connection each time you start a new transaction. This is most likely not what you want in a productive application. Instead you shall use a pooled DataSource, as the c3p0 project provides:
1
2
3
4
5
6
7
8
9
10
11
| <?xml version="1.0" encoding="UTF-8"?>
<dbconfig>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<datasource class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://db-host:3306/db-name?autoReconnect=true</property>
<property name="user">db-user</property>
<property name="password">db-password</property>
</datasource>
</dbconfig> |
<?xml version="1.0" encoding="UTF-8"?>
<dbconfig>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<datasource class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://db-host:3306/db-name?autoReconnect=true</property>
<property name="user">db-user</property>
<property name="password">db-password</property>
</datasource>
</dbconfig>
I stumbled across this problem while implementing a project and receiving a
java.net.SocketException: No buffer space available (maximum connections reached?): connect |
java.net.SocketException: No buffer space available (maximum connections reached?): connect
exception.
Update July 26nd: You will need the autoReconnect=true
parameter with MySQL to avoid problems with connections in the pools not being used for quite a long time.
Update August 18th: This URL parameter doesn’t work correctly. The solution is to add a c3p0.properties file in your classpath:
1
2
3
4
5
6
7
8
9
10
11
| c3p0.maxPoolSize=50
c3p0.minPoolSize=5
c3p0.timeout=0
c3p0.maxStatements=0
c3p0.maxStatementsPerConnection=0
c3p0.idleConnectionTestPeriod=300
c3p0.acquireIncrement=1
c3p0.validate=true
c3p0.preferredTestQuery=SELECT 1;
c3p0.testConnectionOnCheckin=false
c3p0.testConnectionOnCheckout=true |
c3p0.maxPoolSize=50
c3p0.minPoolSize=5
c3p0.timeout=0
c3p0.maxStatements=0
c3p0.maxStatementsPerConnection=0
c3p0.idleConnectionTestPeriod=300
c3p0.acquireIncrement=1
c3p0.validate=true
c3p0.preferredTestQuery=SELECT 1;
c3p0.testConnectionOnCheckin=false
c3p0.testConnectionOnCheckout=true
(Don’t try to set these properties via your hibernate.cfg file. Some of them cannot be set there!)