使用Hikari连接池,JDBC连接oracle数据库,第一次查询正常,第二次报错

那一箭的风情 2017-09-30 12:04:20
使用Hikari连接池,JDBC连接oracle数据库,第一次查询正常,第二次报错,不知道原因在哪里,在线等,不胜感激

报错如下:

九月 30, 2017 11:54:30 上午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [springMvc] in context with path [] threw exception [Handler processing failed; nested exception is java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.isValid(I)Z] with root cause
java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.isValid(I)Z
at com.zaxxer.hikari.proxy.ConnectionProxy.isValid(ConnectionProxy.java:557)
at com.zaxxer.hikari.pool.HikariPool.isConnectionAlive(HikariPool.java:435)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:168)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:84)
at com.wh.util.msp.ConnectionManager.getConnection(ConnectionManager.java:83)
at com.wh.util.msp.JdbcTest.cjcx(JdbcTest.java:376)
at com.wh.controller.msp.MspOraclController.cjcx(MspOraclController.java:166)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)

..........

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

2017-09-30 11:54:54,207 DEBUG [com.zaxxer.hikari.pool.HikariPool] - Before pool cleanup Pool stats HikariPool-0 (total=7, inUse=1, avail=6, waiting=0)
2017-09-30 11:54:54,207 DEBUG [com.zaxxer.hikari.pool.HikariPool] - After pool cleanup Pool stats HikariPool-0 (total=7, inUse=1, avail=6, waiting=0)
2017-09-30 11:55:24,207 DEBUG [com.zaxxer.hikari.pool.HikariPool] - Before pool cleanup Pool stats HikariPool-0 (total=7, inUse=1, avail=6, waiting=0)
2017-09-30 11:55:24,207 DEBUG [com.zaxxer.hikari.pool.HikariPool] - After pool cleanup Pool stats HikariPool-0 (total=7, inUse=1, avail=6, waiting=0)
2017-09-30 11:55:54,207 DEBUG [com.zaxxer.hikari.pool.HikariPool] - Before pool cleanup Pool stats HikariPool-0 (total=7, inUse=1, avail=6, waiting=0)
2017-09-30 11:55:54,207 DEBUG [com.zaxxer.hikari.pool.HikariPool] - After pool cleanup Pool stats HikariPool-0 (total=7, inUse=1, avail=6, waiting=0)
2017-09-30 11:56:24,206 DEBUG [com.zaxxer.hikari.pool.HikariPool] - Before pool cleanup Pool stats HikariPool-0 (total=7, inUse=1, avail=6, waiting=0)


查过这个原因,说是ojdbc版本不对
本人Tomcat8 oracle11g 使用ojdbc6.jar

应该没问题 ,单纯使用JDBC,不使用连接池的话,一切问题都没有,
并且我也查看了oracle , 使用的是ojbc6.jar和ojdbc5.jar MANIFEST 文件如下:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 1.5.0_17-b02 (Sun Microsystems Inc.)
Implementation-Vendor: Oracle Corporation
Implementation-Title: JDBC
Implementation-Version: 11.2.0.1.0
Specification-Vendor: Sun Microsystems Inc.
Specification-Title: JDBC
Specification-Version: 4.0
Main-Class: oracle.jdbc.OracleDriver
sealed: true

Name: oracle/sql/converter/
Sealed: false

Name: oracle/sql/
Sealed: false

Name: oracle/sql/converter_xcharset/
Sealed: false




代码如下:
/**
* 成绩查询
*
* @param req
* @param resp
* @param xn
* 学年
* @return
*/
@RequestMapping(value = "/wx/cjcx.htm", method = { RequestMethod.POST, RequestMethod.GET })
@ResponseBody
public AjaxJson cjcx(HttpServletRequest req, HttpServletResponse resp, String xn) {
AjaxJson json = new AjaxJson();
JdbcTest jt = new JdbcTest();
String xh = (String) req.getSession().getAttribute("wxid");
log.info("成绩查询,学号:{}",xh);
//测试
xh = "20135224";
if (StringUtil.isNotEmpty(xh)) {
List<Map<String, Object>> userList = jt.cjcx(xh, xn); //成绩查询方法
if (userList != null && userList.size() > 0) {
json.setObj(userList);
}
}

return json;
}

JdbcTest文件

package com.wh.util.msp;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.wh.mspentity.User;
import com.wh.util.StringUtil;

public class JdbcTest {
private Logger log = LoggerFactory.getLogger(this.getClass());


/**
* 学生成绩查询
*
* @param xh
* 学号
* @param xn
* 学年
* @return
*/
public List<Map<String, Object>> cjcx(String xh, String xn) {
ConnectionManager cm= ConnectionManager.getInstance();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
List<Map<String, Object>> map = null;
try {
connection = JdbcUtils.getConnection();
connection = cm.getConnection();
StringBuffer sql = new StringBuffer();
sql.append("SELECT T1.XH,T1.XN,T2.MC ,T3.KCMC,T1.KSCS,T1.BFZKSCJ,T1.DJZKSCJ,T1.SFTG,T1.XF,T1.JD,T1.XKKCH ");
sql.append(
"FROM USR_DATAI.T_BZKS_KSCJ T1,USR_ZXBZ.T_ZXBZ_XQ T2,USR_DATAI.T_BZKS_KC T3 WHERE T1.XQDM = T2.DM (+) AND T1.KCDM = T3.KCDM(+) ");
List<Object> params = new ArrayList<Object>();
if (StringUtil.isNotEmpty(xh)) {
sql.append("AND T1.XH = ? ");
params.add(xh);
}
if (StringUtil.isNotEmpty(xn)) {
sql.append("AND T1.XN = ? ");
params.add(xn);
}
sql.append("ORDER BY T1.XN DESC, T1.XQDM DESC");
log.info("图书借阅sql语句:{}", sql.toString());
preparedStatement = connection.prepareStatement(sql.toString());
setParameter(params, preparedStatement);
resultSet = preparedStatement.executeQuery();
map = JdbcUtils.rsToMap(resultSet);
} catch (Exception e) {
} finally {
JdbcUtils.releaseDB(connection, preparedStatement, resultSet);
}

return map;

}


}

ConfigManager 文件

package com.wh.util.msp;

//数据库连接池 单例模式

import java.sql.Connection;
import java.sql.SQLException;

import com.wh.util.base.ConfigManager;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
/**
采用 高性能数据库连接池 HikariCP 数据源
*
*/
public final class ConnectionManager {
private static ConnectionManager instance;
private HikariDataSource dsRead;
private HikariDataSource dsWrite;
private ConnectionManager() throws Exception {

HikariConfig config1 = new HikariConfig();
config1.setMaximumPoolSize(25);
config1.setMinimumIdle(5);
config1.addDataSourceProperty("prepStmtCacheSize", "250");
config1.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
config1.setJdbcUrl((String) ConfigManager.getInstance("db.properties").getConfigItem("jdbcUrl2"));
config1.setUsername((String) ConfigManager.getInstance("db.properties").getConfigItem("user2"));
config1.setPassword((String) ConfigManager.getInstance("db.properties").getConfigItem("password2"));
config1.setDriverClassName((String) ConfigManager.getInstance("db.properties").getConfigItem("driverClass2"));
dsWrite = new HikariDataSource(config1);
}


/**
* 进行线程同步
* 需要在创建类的时候进行同步,所以只要将创建和getInstance()分开,单独为创建加synchronized关键字
*/
private static synchronized void syncInit() {
if (instance == null) {
try {
instance = new ConnectionManager();
} catch (Exception e) {
e.printStackTrace();
}
}
}


public static final ConnectionManager getInstance() {
if (instance == null) {
syncInit();
}
return instance;
}

public final Connection getConnection(String ...mes) {
Connection con = null;
try {

// if(mes.length>=1&&mes[0].equals("R"))
// con= dsRead.getConnection();
// else if(mes.length>=1&&mes[0].equals("W"))
// con= dsWrite.getConnection();
// else
con = dsWrite.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}

protected void finalize() throws Throwable {
dsRead.close();//关闭datasource
dsWrite.close();
}

}






db.properties 如下:
driverClass2=oracle.jdbc.driver.OracleDriver
jdbcUrl2=jdbc:oracle:thin:@192.168.100.64:1521:orcl
#jdbcUrl2=jdbc:oracle:thin:@139.224.201.124:1521:orcl
user2=usr_datai
password2=zzlywisedu123


我判断应该还是 连接池配置哪一点出了问题,但不知道原因所在,恳请各位大神不吝赐教

...全文
5461 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧