我正在尝试使用jdbcTemplate连接到Java中的数据库,我得到以下错误。我用谷歌搜索了很长时间,我找到的所有解决方案都没有解决我的问题。我尝试了几个不同的数据库(SQLServer和MySQL),但都没有工作。
SEVERE: Servlet.service() for servlet [Faces Servlet] in context with path [/promotion-handler-admin] threw exception [Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database!] with root cause
com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:202)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
...
这是我的属性文件:
app.driverClassName=net.sourceforge.jtds.jdbc.Driver
app.url=jdbc:sqlserver://myUrl:port;databaseName=my_database
app.username=myUsername
app.password=myPassword
web应用/ WEB-INF /的applicationContext-database.xml:
<beans:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<beans:property name="driverClass" value="${app.driverClassName}" />
<beans:property name="jdbcUrl"
value="${app.url}" />
<beans:property name="user" value="${app.username}" />
<beans:property name="password" value="${app.password}" />
<beans:property name="acquireIncrement" value="5" />
<beans:property name="idleConnectionTestPeriod" value="600" />
<beans:property name="maxPoolSize" value="10" />
<beans:property name="maxStatements" value="5" />
<beans:property name="minPoolSize" value="3" />
<beans:property name="preferredTestQuery" value="select 1 from DUAL" />
</beans:bean>
<!-- TRANSACTION_MANAGERS -->
<!-- See http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html -->
<!-- Default -->
<beans:bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<beans:property name="dataSource" ref="dataSource" />
</beans:bean>
DAO课程:
@Repository
public class CampaignDAO {
private JdbcTemplate jdbcTemplate;
@Resource(name = "dataSource")
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Campaign> getCampaignList() {
Long start = System.currentTimeMillis();
List<Campaign> queryList;
try {
queryList = jdbcTemplate.query("SELECT * FROM campaign", new RowMapper<Campaign>() {
public Campaign mapRow(ResultSet rs, int line) throws SQLException {
Campaign campaign = new Campaign();
campaign.setId(rs.getLong("id"));
campaign.setExtraInfo(rs.getString("extra_info"));
campaign.setBeginTime(rs.getDate("begin_time"));
campaign.setEndTime(rs.getDate("end_time"));
return campaign;
}
});
} finally {
...
}
return queryList;
}
答案 0 :(得分:8)
对于将来发现此问题的任何人。我做错了是因为我使用的是jtds驱动程序,我忘了在网址中添加它。所以在我的属性文件中我应该做的是:
app.url=jdbc:jtds:sqlserver://myUrl:port;databaseName=my_database
答案 1 :(得分:6)
对于将来发现此问题的任何人。
这也可能是由于缺少数据库驱动程序引起的。
在我的情况下,我使用maven-shade-plugin
并设置了minimizeJar
选项。这当然是丢弃了jtds
驱动程序,因为它没有直接引用到任何地方。
这可以修复如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>true</minimizeJar>
<filters>
<filter>
<!-- Make sure jtds is included. -->
<artifact>net.sourceforge.jtds:jtds</artifact>
<includes>
<include>**</include>
</includes>
</filter>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
<exclude>META-INF/*.sf</exclude>
<exclude>META-INF/*.dsa</exclude>
<exclude>META-INF/*.rsa</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
答案 2 :(得分:2)
如果像我一样使用Tomcat的Maven插件运行您的应用程序,也可以显示此消息:
new Handler(getContext().get().getMainLooper()).post(() -> {
if (CommonHelper.isNOrAbove()) {
connectedGatt = connectedBLEDevice.connectGatt(context.get(), true, gattCallback, BluetoothDevice.TRANSPORT_AUTO);
Timber.tag("HED-BT").d("Connecting BLE after N");
} else {
try {
Method connectGattMethod = connectedBLEDevice.getClass().getMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class);
connectedGatt = (BluetoothGatt) connectGattMethod.invoke(connectedBLEDevice, context.get(), false, gattCallback, BluetoothDevice.TRANSPORT_AUTO);
Timber.tag("HED-BT").d("Connecting BLE before N");
} catch (Exception e) {
failedConnectingBLE();
}
}
});
你的Maven依赖项中有一个mvn clean install tomcat7:run
范围元素:
provided
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
<scope>provided</scope>
</dependency>
范围将阻止连接器成为provided
存档的一部分,并且Tomcat插件将找不到用于建立数据库连接的连接器。
只需从依赖项中删除war
范围即可解决问题。
答案 3 :(得分:1)
在我的情况下,问题与MySQL和mysql-connector-java之间的版本错误有关。经过几天的头痛之后,我在一个单独的干净项目中取出了ComboPooledDataSource模块,并尝试将其连接到MySQL。但是,我得到了stacktrace(很遗憾,我忘记了确切的内容),据我了解,问题与版本有关。
答案 4 :(得分:0)
我在mchange-commons-java 0.2.6.3的c3p0 0.9.5-pre6上遇到了这个问题。降级到c3p0 0.9.5-pre5和mchange-commons-java 0.2.6.2之后,问题就消失了。