我正在尝试实现Apache Tomcat的内置JDBC连接池。但我对很多事情感到困惑。
官方页面中提到了两种初始化连接池的方法。
一个使用JNDI查找,另一个使用java PoolProperty
类。
对于JNDI查找,我们必须向context.xml
或server.xml
添加条目并在java代码中初始化它。这需要硬编码数据库连接细节。
对于池属性,我们必须使用datasource对象在PoolProperty
类中设置各种连接属性。是否需要实例化工厂? (org.apache.tomcat.jdbc.pool.DataSourceFactory
)
每当尝试使用池属性时,我都会收到错误:
严重:无法创建池的初始连接。 java.sql.SQLException:调用时的无效参数 oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
我检查并确认所有属性都是正确的。一旦我使用xml方法,就会出现此错误。有人可以帮助我在没有xml的情况下配置池的正确方法吗?
这个独立的java代码给了我错误: PoolProperties p = new PoolProperties();
String dburl="jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=hostname) (PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=shostname2)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=Service)))";
p.setUrl(dburl);
p.setDriverClassName("oracle.jdbc.OracleDriver");
p.setUsername(username);
p.setPassword(pwd);
p.setJmxEnabled(true);
p.setTestWhileIdle(false);
p.setTestOnBorrow(true);
p.setValidationQuery("SELECT 1 from dual");
p.setTestOnReturn(false);
p.setValidationInterval(30000);
p.setTimeBetweenEvictionRunsMillis(30000);
p.setMaxActive(100);
p.setInitialSize(10);
p.setMaxWait(10000);
p.setRemoveAbandonedTimeout(600);
p.setMinEvictableIdleTimeMillis(30000);
p.setMinIdle(10);
p.setLogAbandoned(true);
p.setRemoveAbandoned(true);
p.setJdbcInterceptors(
"org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"
+ "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;"
+ "org.apache.tomcat.jdbc.pool.interceptor.ResetAbandonedTimer");
p.setLogValidationErrors(true); datasource = new org.apache.tomcat.jdbc.pool.DataSource( );
datasource.setPoolProperties(p);
当我将一个全局资源添加到Server.xml时,它正在工作。
资源验证="容器" description ="可以是用户数据库 更新并保存" 工厂=" org.apache.tomcat.jdbc.pool.DataSourceFactory" 名称=" JDBC /数据库"类型=" javax.sql.DataSource中" />
请帮助我理解,正确的实施方式是什么。