gpt4 book ai didi

java - 带有 Sql Server 2008 的 Jdbc 连接池失败

转载 作者:行者123 更新时间:2023-11-28 22:43:16 26 4
gpt4 key购买 nike

我正在尝试将我的 jdbc 代码转换为在 Tomcat 上使用连接池功能。我的系统是一个连接到 SQL Server 2008 的 jsp/servlet 应用程序。所以,让我们来看看代码...

我的连接类如下所示:

    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
}

现在,在我的 runner 类中,我初始化了这个类并尝试连接到我的数据库,但是我在命令 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 驱动程序可以完成这项工作?

最佳答案

好的,找到问题了,答案很简单。查看 PoolProperties 的规范,它说:

setDriverClassName():要使用的 JDBC 驱动程序的完全限定 Java 类名。 驱动程序必须可以从与 tomcat-jdbc.jar 相同的类加载器访问

因此即使我的应用程序可以访问驱动程序,Tomcat 也无法访问它。于是把驱动放到$CATALINA_HOME/libs目录下,重启Tomcat就解决了这个问题。

关于java - 带有 Sql Server 2008 的 Jdbc 连接池失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19312801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com