为JBoss上的XA连接设置集成安全性

时间:2013-03-21 11:18:02

标签: sql-server jboss jndi xa windows-integrated-auth

当将JBoss上的XA数据源中的IntegratedSecurity设置为true时,Microsoft的JDBC驱动程序不会将“true”设置解析为布尔值,但会引发错误:

java.lang.NoSuchMethodException:
com.microsoft.sqlserver.jdbc.SQLServerXADataSource.setIntegratedSecurity(java.lang.String)

这只是使用XA数据源时的问题,非XA数据源在集成安全性下正常工作。

是否有其他方法可以为JBoss上的XA连接设置集成安全性,或者在设置xa-datasource-property时告诉它发送布尔值?


要重现此行为:

a)在JBoss AS configuration \ standalone \ standalone.xml中添加一个新的xa-datasource到JNDI:

<xa-datasource jta="true" jndi-name="java:jboss/datasources/jndiName" pool-name="poolName" enabled="true" use-java-context="true" use-ccm="true">
    <xa-datasource-property name="ServerName">
        localhost
    </xa-datasource-property>
    <xa-datasource-property name="DatabaseName">
        MyDbName
    </xa-datasource-property>
    <xa-datasource-property name="SelectMethod">
        cursor
    </xa-datasource-property>
    <!-- this should work but doesn't -->
    <xa-datasource-property name="IntegratedSecurity">
        true
    </xa-datasource-property>
    <xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class>
    <driver>sqljdbc</driver>
    <xa-pool>
        <is-same-rm-override>false</is-same-rm-override>
    </xa-pool>
    <validation>
        <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"/>
    </validation>
</xa-datasource>

b)重启JBoss AS

c)尝试使用配置的JNDI连接执行查询:

InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup("java:jboss/datasources/jndiName");
Connection conn = null;
try {
    conn = ds.getConnection();

    // try to execute something
    CallableStatement stmt = conn.prepareCall("{? = call some_stored_procedure()}");
    stmt.execute();
} finally {
    if (conn != null)
        conn.close();
}

执行此代码将导致异常声明:

java.lang.NoSuchMethodException: 
com.microsoft.sqlserver.jdbc.SQLServerXADataSource.setIntegratedSecurity(java.lang.String)

1 个答案:

答案 0 :(得分:3)

我也遇到过这种情况,但如果我使用URL xa-datasource-property,我就可以使用它。

示例:

<xa-datasource-property name="URL">jdbc:sqlserver://<host>:<port>;database=<db>;integratedSecurity=true</xa-datasource-property>  

需要删除这些代码段:

<xa-datasource-property name="ServerName">
    localhost
</xa-datasource-property>
<xa-datasource-property name="DatabaseName">
    MyDbName
</xa-datasource-property>
<xa-datasource-property name="SelectMethod">
    cursor
</xa-datasource-property>
<!-- this should work but doesn't -->
<xa-datasource-property name="IntegratedSecurity">
    true
</xa-datasource-property>