我正在尝试将我的jdbc代码转换为在Tomcat上使用连接池功能。我的系统是连接到SQL Server 2008的jsp / servlet应用程序。所以,让我们来看看代码...
My Connection类看起来像这样:
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;
//... some more imports
public class DbPooledConnectionToMSSQL {
public String dbsource ;
private Connection dbCon;
private DataSource datasource = new DataSource();
private PoolProperties p = new PoolProperties();
public DbPooledConnectionToMSSQL() {
super();
dbsource = "jdbc:sqlserver://xxx.xxx.x.x:1433;database=xxx";
String user = "user";
String password = "pass";
p.setUrl(dbsource);
p.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//p.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource");
p.setUsername(user);
p.setPassword(password);
p.setMaxActive(100);
p.setInitialSize(10);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(60);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(10);
datasource.setPoolProperties(p);
}
public boolean connect() throws ClassNotFoundException, SQLException {
try {
if (dbCon == null) {
System.err.println("Creating Pooled Connection....");
dbCon = datasource.getConnection(); //<-- here is the exception
System.err.println("!!! Pooled Connection creation OK");
} else {
System.err.println("!!! Connection EXIST not creation");
}
} catch (SQLException e) {
return false;
} catch (Exception e) {
return false;
}
return true;
}
//more code below
}
现在,在我的跑步者类中,我初始化这个类并尝试连接到我的数据库,但是我在命令dbCon = datasource.getConnection();
上得到了着名的ClassNotFoundException
我确信连接驱动程序已经到位,因为它已经在我的常规jdbc代码(而不是连接池)中使用,并且运行正常。
我也尝试使用com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource
作为驱动程序类,但我也得到了同样的例外:
java.sql.SQLException: com.microsoft.sqlserver.jdbc.SQLServerDriver
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:254)
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182)
at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:702)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:634)
at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:488)
at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:144)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:103)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:127)
at admin.db.DbPooledConnectionToMSSQL.connect(DbPooledConnectionToMSSQL.java:97)
......
Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:246)
我在这里做错了什么?还有另一个jdbc驱动程序可以完成这项工作吗?
答案 0 :(得分:2)
好的,发现问题并且答案很简单。查看PoolProperties的规范,它说:
setDriverClassName():要使用的JDBC驱动程序的标准Java类名。 必须可以从与tomcat-jdbc.jar相同的类加载器访问驱动程序
因此,即使我的应用程序可以访问驱动程序,Tomcat也无法访问它。因此,将驱动程序放在$CATALINA_HOME/libs
目录中并重新启动Tomcat可以解决此问题。