【问题标题】:WSJdbcConnection does not wrap any objects of type com.microsoft.sqlserver.jdbc.SQLServerConnectionWSJdbcConnection 不包装任何类型为 com.microsoft.sqlserver.jdbc.SQLServerConnection 的对象
【发布时间】:2019-06-01 14:04:35
【问题描述】:

我正在使用 SQLServerBulkCopy API 在 SQL Server 数据库中存储数百万条记录。我收到一条错误提示

“com.microsoft.sqlserver.jdbc.SQLServerException:目标 连接必须是来自 Microsoft JDBC Driver for SQL 的连接 服务器”

在初始化过程中

SQLServerBulkCopy bulkCopy =  new SQLServerBulkCopy(conn);

所以我解开了连接

SQLServerConnection conn = connection.unwrap(SQLServerConnection.class);

原来的连接是com.ibm.ws.rsadapter.jdbc.WSJdbcConnection@8da2f3e2

看完之前提出的以下问题后
1.WSJDBCConnection does not wrap objects of type Oracle jdbc Connection
2.I get the `DSRA9122E: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection@d3t7e556 does not wrap any objects of type oracle.jdbc.OracleConnection

我发现是因为sqljdbc42.jar的classLoader,datasource和application不匹配

所以我像这样更改了我的 server.xml

 <library id="global">
   <fileset dir="${server.config.dir}/lib/global" includes="*.jar"/>
 </library>

 <jdbcDriver id="SqlJdbcDriver"              
                javax.sql.DataSource = 
 "com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource"
                 libraryRef="global"/>

 <application id="myApp" name="myApp" type="ear" location="myApp.ear">
   <classloader commonLibraryRef="global"/>
 </application>

datasource 标记驻留在另一个 server.xml 中,它是 env 特定于 env 的 -

<dataSource id="myDS" jdbcDriverRef="SqlJdbcDriver" jndiName="jdbc/myDS">
    <connectionManager agedTimeout="2m" connectionTimeout="2s" maxPoolSize="50" minPoolSize="0" />
    <properties.microsoft.sqlserver databaseName="myDB" serverName="xxx.com" /> 
</dataSource>

sqljdbc42.jar 也位于 lib/global 目录中。
另外,我删除了 dropins 目录并将 myApp 放置在应用程序目录中,因为如果应用程序存在于 dropins 目录中,application 标记将不起作用。

在所有这些更改之后,我也得到了异常

"com.ibm.ws.rsadapter.jdbc.WSJdbcConnection@8155ea2d 不包装任何 com.microsoft.sqlserver.jdbc.SQLServerConnection 类型的对象。”

任何人都可以找出解决方案或我还缺少什么吗?

【问题讨论】:

    标签: sql-server jdbc datasource websphere-liberty server.xml


    【解决方案1】:

    JDBC 包装器模式 java.sql.Wrapper.unwrap(c) 仅用于作为接口类展开,而不是具体的实现类。

    com.microsoft.sqlserver.jdbc.SQLServerConnection是一个实现,好在微软的JDBC Driver也为它提供了一个接口:com.microsoft.sqlserver.jdbc.ISQLServerConnection

    尝试解包为接口,

    ISQLServerConnection conn = connection.unwrap(ISQLServerConnection.class);
    

    【讨论】:

    • 在界面工作时展开。但是 ISQLServerConnection 打印 com.sun.proxy.$Proxy252 并且不是 SQLServerConnection 的实例,所以我得到了同样的异常 com.microsoft.sqlserver.jdbc.SQLServerException: Destination connection must be a connection from the Microsoft JDBC Driver for SQL Server. 此外,铸造给了 ClassCastException
    • @GayathriNagarajan 听起来SQLServerBulkCopy 应该检查接口而不是具体类。否则,您将需要直接获得物理连接,而不使用来自 WebSphere 的数据源。您可能需要考虑在 github.com/Microsoft/mssql-jdbc 提交错误
    • @MarkRotteveel 是的,物理连接有效!谢谢,我也在那个网址打开了一个问题。
    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2023-03-19
    • 1970-01-01
    • 2013-08-29
    • 2019-07-12
    相关资源
    最近更新 更多