Microsoft SQLServer驱动程序数据源的密码为空

时间:2014-12-11 09:00:44

标签: java sql-server datasource

我正在研究一个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,说不能用用户名登录。设置一个断点和debuging,我看到当Java代码从上下文获取数据源时,它没有密码!!!

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并没有从jetty获取密码。我尝试使用不同的

wtf的任何线索都在这里发生?

PD:我们正在使用Jetty 6和一个旧的自定义版本的jetty-run-jetty插件,它可以自动应用maven叠加层。因此,改变码头版本不是一个选择。

编辑:添加了dsnames字符串

2 个答案:

答案 0 :(得分:0)

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

  

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

     

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

     

InitialContext ic = new InitialContext();
  DataSource myDS = DataSource)ic.lookup(&#34; java:comp / env / jdbc / myds&#34;);

答案 1 :(得分:0)

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

  1. 在参考查找后自己设置密码,就像在第一个示例中一样。
  2. 使用连接池,如Tomcat Pool,Apache Pool或Spring的DriverMnagerConnecionPool,并配置它们以使用MS驱动程序。
  3. 问题是MS SQLServerDataSource实现了Referenceable,当JNDI环境询问它的引用时,它不提供其password参数。这是在驱动程序代码中硬编码的。 因此,当从引用重构数据源时,密码不再存在。