public class MyFactory extends BasicDataSourceFactory {
public MyFactory () {}
@Override
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws SQLException {
return super.getObjectInstance(obj, name, nameCtx, environment);
}
}
我在context.xml中使用该类作为我的资源定义中的工厂。
<Resource name="MyResource"
auth="Container"
type="javax.sql.DataSource"
factory="path.to.my.factory.MyFactory"
username="myusername"
password="mypassword"
driverClassName="oracle.jdbc.OracleDriver"
url="myUrl"
maxTotal="8"
maxIdle="4"
defaultAutoCommit="true"
removeAbandonedOnBorrow="true"
removeAbandonedOnMaintenance="true"
removeAbandonedTimeout="60"
validationQuery="SELECT 1 FROM DUAL">
</Resource>
然后我尝试检索Myresource:
Context envCtx = (Context) new InitialContext().lookup("java:comp/env");
ds = (DataSource) envCtx.lookup("MyResource");
ds.getConnection().setAutoCommit(false);
数据源似乎可以创建确定,因为DDS具有context.xml中定义的所有属性(用户,密码,URL,驱动程序...)。但是,当我致电GetConnection时,我会得到ora-28040error
.。 wow,如果我从数据源资源的定义中删除该行(我认为它将使用通用工厂),则GetConnection可以正常工作。我想念什么?根据
oracleDocumentation。 我尝试了一些最新版本的ojdbc8,所以我的pom.xml
看起来像:
factory="path.to.my.factory.MyFactory"
或:
<!-- mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>23.5.0.24.07</version>
</dependency>
我使用Apachetomcat8.5.76.
我终于自己找到了解决方案。问题在于,我必须从org.apache.tomcat.dbcp.dbcp2从orgache.apache.apache.apmace.commons.commons.dbcp2扩展
basicdatasourcefactory。显然,这两个类别都存在一些差异,并且不会以相同的方式管理身份验证。希望它有帮助