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

Java Microsoft SQLServer驱动程序数据源的密码为空,java,sql-server,datasource,Java,Sql Server,Datasource,我正在从事一个Java项目,该项目使用jetty在访问一些数据库的本地Web服务上运行。我们曾使用JTD访问SQLServer数据库,但现在我们需要使用DATETIME2字段,这迫使我们使用MicrosoftSQLServer驱动程序而不是JTD 所以,在设置all以使用它之前,在一些junit测试上运行OK,使用这些驱动程序直接创建连接对象,当我们尝试主应用程序时,我们会遇到麻烦。 我们有一个jetty-env.xml,如下所示: <?xml version="1.0" encodin

我正在从事一个Java项目,该项目使用jetty在访问一些数据库的本地Web服务上运行。我们曾使用JTD访问SQLServer数据库,但现在我们需要使用DATETIME2字段,这迫使我们使用MicrosoftSQLServer驱动程序而不是JTD

所以,在设置all以使用它之前,在一些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>
如果我取消对sqlds.setPassword行的注释,它会将ok连接到数据库。因此,由于一个未知的原因,SQLServerDataSource没有从jetty获得密码。我试着用不同的语言 这里有没有wtf的线索

PD:我们正在使用Jetty 6和一个旧的定制版本的Jetty run Jetty插件,该插件可以自动应用maven覆盖。因此,改变jetty版本目前不是一个选项


编辑:添加了dsnames字符串

好的,阅读Jetty文档,我看到生成数据源对象的是Jetty:

要在servlet/filter/etc中查找数据源,请执行以下操作:

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

InitialContext ic=新的InitialContext; datasourcemyds=DataSourceic.lookupjava:comp/env/jdbc/myDS


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

在引用查找之后,像在第一个示例中一样自行设置密码。 使用连接池,如Tomcat池、Apache池或Spring的DriverManager连接池,并将它们配置为使用MS驱动程序。 问题是MS SQLServerDataSource实现了Referenceable,当JNDI环境要求其引用时,它不提供其密码参数。这在驾驶员代码中是硬编码的。
因此,当从引用中重构数据源时,密码就不再存在了

对于上下文查找,您使用的是什么dsName?这个数据源是由您创建的还是它的预制的?我认为可以由hibernate构建?但我不确定。。。巨大的旧代码库jaja!Java1.4/5!在我之前,我找不到的是正在生成的数据源。
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;