【发布时间】:2014-12-11 09:00:44
【问题描述】:
我正在开发一个 Java 项目,该项目使用 jetty 在访问某些数据库的本地 Web 服务上运行。我们使用 jtds 访问 SQLServer 数据库,但现在我们需要使用 DATETIME2 字段,这强制我们使用 Microsft SQLServer 驱动程序而不是 jtds。
所以,在设置所有使用它之前,并在一些使用这些驱动程序直接创建 Connection 对象的 junit 测试上运行 OK,当我们尝试主应用程序时,我们遇到了麻烦。 我们有一个这样的 jetty-env.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
<Call class="org.mortbay.log.Log" name="warn">
<Arg>executing jetty-env.xml</Arg>
</Call>
<New id="DATABASE" class="org.mortbay.jetty.plus.naming.Resource">
<Arg>jdbc/DATABASE</Arg>
<Arg>
<!-- Servidor SQLserver -->
<New class="com.microsoft.sqlserver.jdbc.SQLServerDataSource">
<Set name="User">username</Set>
<Set name="Password">password</Set>
<Set name="DatabaseName">databasename</Set>
<Set name="ServerName">servername</Set>
<Set name="PortNumber">portnumber</Set>
</New>
</Arg>
</New>
</Configure>
但是当我在 Eclipse 上使用 Jetty 启动应用程序时,我收到一个 SQLException 说无法使用用户名登录。设置断点调试,看到Java代码从上下文中获取Datasource时,没有密码!!!
String dsName = props.getProperty ("hibernate.connection.datasource"); // "java:comp/env/jdbc/DATABASE"
Context ctx = new InitialContext();
SQLServerDataSource sqlds = (SQLServerDataSource) ctx.lookup (dsName);
//sqlds.setPassword ("passoword");
DataSource ds = (DataSource) sqlds;
如果我取消注释 sqlds.setPassword 行,它可以连接到数据库。因此,由于未知原因,SQLServerDataSource 没有从码头获取密码。我尝试使用不同的
这里有任何关于 wtf 的线索吗?
PD:我们正在使用 Jetty 6 和一个旧的自定义版本的 jetty-run-jetty 插件,该插件会自动应用 maven 覆盖。因此,此时更改码头版本不是一种选择。
编辑:添加 dsnames 字符串
【问题讨论】:
-
对于上下文查找,您使用的是什么 dsName ?这个数据源是你自己创建的还是预制的?
-
我认为这可以通过 hibernate 构建?但我不确定......在我之前并且我找不到的巨大旧代码库(jaja!Java 1.4/5 !)正在生成数据源。
标签: java sql-server datasource