我们正在为 Java Web 应用程序运行 glassfish 4,并且遇到了计时器问题。普通 servlet 调用可以享受任意数量的不同连接,这使得集成变得更加容易。然而,一旦我们添加计时器,数据源就需要是“XA”数据源。我们设置如下:
public XADataSource getNewConnection() {
Encapsulations encap = new Encapsulations();
XADataSource ds = null;
try {
Context ctx = new InitialContext();
if(!encap.getDataSource().equals("Production")){
ds = (XADataSource) ctx.lookup("jdbc/XA_TEST");
}else{
ds = (XADataSource) ctx.lookup("jdbc/XA");
}
} catch (Exception e) {
CatchException.logException(null, e);
String error = e.toString();
}
return ds;
}
问题是,当 ds = (XADataSource) ctx.lookup("jdbc/XA_TEST") 行运行时,我们收到此错误:
java.lang.ClassCastException:com.sun.gjc.spi.jdbc40.DataSource40 无法转换为 javax.sql.XADataSource
我们使用 sqljdbc42 jar 进行正常连接,因此在其中看到 40 有点奇怪。有人知道问题是什么吗?我们使用的数据源被设置为 XADataSource,除了下载不同的 jar 之外,我不知道缺少什么。
我已经有一段时间没有使用 Glassfish 了,但据我记得,您应该为具有 XADataSource 接口实现的数据库提供程序安装 jar。在 MS SQL Server 中,我使用了 jTDS 驱动程序。
代码片段中要考虑的另一件事是,您应该有不同的 glassfish 配置用于开发和生产,您应该将此类事情留给应用程序服务器,而不是放在代码中。 Glassfish 是一个完整的 JavaEE 应用服务器,它具有包括数据库连接池在内的所有优点。