WSJdbcConnection не переносит объекты типа com.microsoft.sqlserver.jdbc.SQLServerConnection - PullRequest
1 голос
/ 01 июня 2019

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

"com.microsoft.sqlserver.jdbc.SQLServerException: назначение соединение должно быть соединением от Microsoft JDBC Driver для SQL Сервер "

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

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 используется 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 dir.
Кроме того, я удалил директорию dropins и поместил myApp в директорию apps, так как тег application не будет работать, если приложение присутствует в директории dropins.

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

"com.ibm.ws.rsadapter.jdbc.WSJdbcConnection@8155ea2d не выполняет перенос объекты типа com.microsoft.sqlserver.jdbc.SQLServerConnection. "

Кто-нибудь может выяснить, в чем решение или что мне все еще не хватает?

1 Ответ

2 голосов
/ 01 июня 2019

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

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

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

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