c3p0报空指针异常

本文详细分析了一个在使用C3P0连接数据库时遇到的空指针异常问题,通过对比测试类和servlet中的配置发现C3P0配置路径不同导致错误。通过将配置文件放置于classes目录下并重新导入相关包解决了问题,强调了配置一致性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

</pre><strong><span style="font-family:Comic Sans MS;font-size:18px;">今天建了个登录的小项目, 使用c3p0搭配DBUtil连接数据库,然后使用测试类测试连接数据库的方法可以连接,但是用servlet调用这个方法就报空指针异常.不知道是怎么回事,估计问题很罕见,网上找半天也找不到出错的原因.</span></strong><p><strong><span style="font-family:Comic Sans MS;font-size:18px;">部分源码是这样的:</span></strong></p><p><pre name="code" class="java"><strong><span style="font-family:Comic Sans MS;font-size:18px;">//-------------这是连接数据库的----------------
public class SimpleModule {
	private static DataSource ds;
	
	static {
		ds = new ComboPooledDataSource();
	}
	
	public void insertUser(User u) {
		String createUser = "insert into userinfo values(null,?,?)";
System.out.println("beforeQueryRunner");
		QueryRunner qr = new QueryRunner(ds);
		try {
			qr.update(createUser, u.getUsername(), u.getPassword());
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public User getUser(User u) {
		String getUser = "select * from userinfo where username=? and password=?";
System.out.println("beforeqr");
		QueryRunner qr = new QueryRunner(ds);
System.out.println(u);
		User user = null;
		try {
			user = qr.query(getUser, new BeanHandler<User>(User.class), u.getUsername(), u.getPassword());
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return user;
	}</span></strong>

在调用query方法时,u无论从测试类还是servlet传过来都是有值的.就是执行query方法这一步出了错,不知道为何.

<strong><span style="font-family:Comic Sans MS;font-size:18px;">//----这是servlet里的调用getUser的方法---------------
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		String userName = request.getParameter("username");
		String password = request.getParameter("password");
		User u = new User();
		u.setUsername(userName);
		u.setPassword(password);
		
		SimpleModule sm = new SimpleModule();
		User user = sm.getUser(u);
}
//------这是测试类里的方法------------------
	@Test
	public void getUserTest() {
		User u2 = new User();
		u2.setUsername("sdf");
		u2.setPassword("sdf");
		User user = sm.getUser(u2);
		if (user != null) {
			System.out.println(user);
		} else {
			System.out.println("null");
		}
	}</span></strong>

其实我认为,我写的方法应该没什么错,就是query方法的错,还有就是可能我懒省事把模型层所有东西都写在了一起所以出错?

<strong><span style="font-family:Comic Sans MS;font-size:18px;">//---------这是报错的信息-------------------
五月 11, 2016 11:09:32 下午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource 
信息: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> y6nvpz9g18hubuj2s97ws|db0359, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> null, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> y6nvpz9g18hubuj2s97ws|db0359, idleConnectionTestPeriod -> 0, initialPoolSize -> 3, jdbcUrl -> null, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 15, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 3, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]
五月 11, 2016 11:10:02 下午 com.mchange.v2.resourcepool.BasicResourcePool 
警告: com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask@1239c31 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
java.lang.NullPointerException
	at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.java:524)
	at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.java:493)
	at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.java:307)
	at java.sql.DriverManager.getDriver(DriverManager.java:262)
	at com.mchange.v2.c3p0.DriverManagerDataSource.driver(DriverManagerDataSource.java:285)
	at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:161)
	at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:161)
	at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:147)
	at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:202)
	at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1138)
	at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1125)
	at com.mchange.v2.resourcepool.BasicResourcePool.access$700(BasicResourcePool.java:44)
	at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1870)
	at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
五月 11, 2016 11:10:02 下午 com.mchange.v2.resourcepool.BasicResourcePool 
警告: Having failed to acquire a resource, com.mchange.v2.resourcepool.BasicResourcePool@7b39a1 is interrupting all Threads waiting on a resource to check out. Will try again in response to new client requests.</span></strong>

慢慢分析报错信息吧...

------------------------更新 16/5/12-----------------------------------------

发现问题了, 测试类的c3p0配置是我配置文件里的配置,servlet配置是个莫名其妙的配置,大概是路径不同吧

<span style="font-family:Comic Sans MS;">Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 2, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, contextClassLoaderSource -> caller, dataSourceName -> y6nvpz9g18ju4qz18rkmtj|1424bf0, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, extensions -> {}, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, forceSynchronousCheckins -> false, forceUseNamedDriverClass -> false, identityToken -> y6nvpz9g18ju4qz18rkmtj|1424bf0, idleConnectionTestPeriod -> 0, initialPoolSize -> 10, jdbcUrl -> jdbc:mysql://localhost:3306/mydata?useUnicode=true&characterEncoding=UTF-8, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 30, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 20, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 5, numHelperThreads -> 3, preferredTestQuery -> null, privilegeSpawnedThreads -> false, properties -> {user=******, password=******}, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, userOverrides -> {}, usesTraditionalReflectiveProxies -> false ]</span>

可是之前就是这样写的却从未报过错,今天用了过滤器和Listener,但是也不应该出这种问题啊,究竟怎么改呢?
----------------------更新 16/5/13 21:19--------------------------------------
解决了:

出错原因: 


前两天懒省事想着把常用的jar包都放入Tomcat的lib文件夹下,就不用在项目中手动导包--
错就出在这里,c3p0读取xml配置文件指定是在classes文件夹下,我想把它的包放在Tomcat的lib下在运行时没加载到配置文件,所以才出这种错大哭

解决方法:



再把c3p0的相关包导入工程就好了...

总结:还是不能偷懒啊

(又改了改文章样式...)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值