【问题标题】:Microsoft SQLServer driver datasource have password emptyMicrosoft SQLServer 驱动程序数据源的密码为空
【发布时间】: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


【解决方案1】:

好的,阅读 Jetty 文档,我知道是 Jetty 正在生成 DataSource 对象:https://wiki.eclipse.org/Jetty/Feature/JNDI#Configuring_DataSources

在您的 servlet/filter/etc 中查找您的数据源:

导入 javax.naming.InitialContext;
导入 javax.sql.DataSource;

InitialContext ic = new InitialContext();
数据源 myDS = DataSource)ic.lookup("java:comp/env/jdbc/myds");

【讨论】:

    【解决方案2】:

    如果您绝对需要使用 MS 驱动程序,您应该:

    1. 在参考查找后自行设置密码,就像在第一个示例中所做的那样。
    2. 使用 Tomcat Pool、Apache Pool 或 Spring 的 DriverMnagerConnecionPool 等连接池,并将它们配置为使用 MS 驱动程序。

    问题在于 MS SQLServerDataSource 实现了 Referenceable,当 JNDI 环境要求它引用它时,它没有提供其密码参数。这是在驱动程序代码中硬编码的。 因此,当从引用重建数据源时,密码不再存在。

    【讨论】:

      猜你喜欢
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2017-04-06
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      相关资源
      最近更新 更多