WSJdbcConnection не упаковывает объекты типа com.microsoft.sqlserver.jdbc.SQLServerConnection.

Я использую API SQLServerBulkCopy для хранения миллионов записей в базе данных SQL Server. я получаю сообщение об ошибке

«com.microsoft.sqlserver.jdbc.SQLServerException: целевое соединение должно быть соединением из драйвера Microsoft JDBC для SQL Server»

во время инициализации, как

SQLServerBulkCopy bulkCopy =  new SQLServerBulkCopy(conn);

Итак, я развернул соединение

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

Исходное соединение com.ibm.ws.rsadapter.jdbc.WSJdbcConnection@8da2f3e2

После рассмотрения следующих ранее заданных вопросов
1. WSJDBCConnection не упаковывает объекты типа Oracle jdbc Connection
2. Я получаю сообщение `DSRA9122E: com.ibm.ws.rsadapter.jdbc.WSJdbcConnection@d3t7e556 не содержит объектов типа oracle.jdbc.OracleConnection

Я обнаружил, что это из-за classLoader для sqljdbc42.jar, несоответствия между источником данных и приложением

Итак, я изменил свой 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>

Тег источника данных находится в другом файле server.xml, специфичном для env by 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 в каталог apps, поскольку тег application не будет работать, если приложение присутствует в каталоге dropins.

После всех этих изменений тоже получаю исключение

«com.ibm.ws.rsadapter.jdbc.WSJdbcConnection@8155ea2d не упаковывает объекты типа com.microsoft.sqlserver.jdbc.SQLServerConnection».

Может ли кто-нибудь понять, какое решение или что еще мне не хватает?


person Gayathri    schedule 01.06.2019    source источник


Ответы (1)


Шаблон оболочки JDBC, java.sql.Wrapper.unwrap(c), предназначен для развертывания только как классы интерфейса, а не конкретные классы реализации.

com.microsoft.sqlserver.jdbc.SQLServerConnection является реализацией, но, к счастью, драйвер Microsoft JDBC также предоставляет для него интерфейс: com.microsoft.sqlserver.jdbc.ISQLServerConnection.

Попробуйте развернуть как интерфейс,

ISQLServerConnection conn = connection.unwrap(ISQLServerConnection.class);
person njr    schedule 01.06.2019
comment
Развертка как интерфейс работала. Но 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. - person Gayathri; 02.06.2019
comment
@GayathriNagarajan Похоже, этот SQLServerBulkCopy должен проверять интерфейс, а не конкретный класс. В противном случае вам потребуется получить физическое подключение напрямую, без использования источника данных из WebSphere. Возможно, вы захотите сообщить об ошибке на странице github.com/Microsoft/mssql-jdbc. - person Mark Rotteveel; 02.06.2019
comment
@MarkRotteveel Да, физическое соединение сработало! Спасибо, и я тоже открыл вопрос по этому адресу. - person Gayathri; 02.06.2019