我的环境:面向企业Java开发人员的Eclipse IDE,版本:2019-09 R(4.13.0)
服务器:WildFly 13.0.0.Final
我正在尝试将数据批量上传到Sql Server,并且以下代码在具有相同版本的WildFly服务器中可以正常运行,但在具有java.lang.ClassCastException的相同wildfly服务器的客户端服务器计算机中失败:org.jboss.jca.adapters无法在以下语句中将.jdbc.jdk8.WrappedPreparedStatementJDK8强制转换为com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement:
SQLServerPreparedStatement pStmt = (SQLServerPreparedStatement) con.prepareStatement(execStoredProc);
这是完整的代码:
import com.microsoft.sqlserver.jdbc.SQLServerDataTable;
import com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement;
import java.sql.*;
import java.util.ArrayList;
public class DatabaseExtended extends Database {
public DatabaseExtended(String assetDisposition, String assetDisposition_ds) {
super(assetDisposition, assetDisposition_ds);
// TODO Auto-generated constructor stub
}
public Object executeEstimateStructured(int iClientID, SQLServerDataTable sourceDataTable) {
//boolean rs = false;
ArrayList<String[]> lst = new ArrayList<String[]>();
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection(super.connectionUrl);
Statement stmt = con.createStatement();
String execStoredProc = "EXEC UploadEstimate ?,?";
SQLServerPreparedStatement pStmt = (SQLServerPreparedStatement) con.prepareStatement(execStoredProc);//<--Exception here
pStmt.setInt(1, iClientID);
pStmt.setStructured(2, "dbo.UT_Estimate", sourceDataTable);
ResultSet rs = pStmt.executeQuery();
int columnCount = rs.getMetaData().getColumnCount();
while (rs.next()) {
int i = 1;
String[] cols = new String[columnCount];
while (i <= columnCount) {
cols[i - 1] = rs.getString(i++);
}
lst.add(cols);
}
con.close();
}
catch (SQLException e) {
e.printStackTrace();
}
return lst;
}
}```
在对该异常进行谷歌搜索时,我碰到了这个链接,该链接讨论了将jboss-deployment-structure.xml文件放置在WEB-INF文件夹中并提到了相关性。以下是我的jboss-deployment-structure.xml文件
我在构建路径以及Deployment结构中都引用了mssql-jdbc-7.4.1.jre8.jar文件,以便将依赖项添加到web-inf / lib文件夹下。
现在,在将此jboss-deployment-structure.xml文件放入web-inf文件夹并部署war文件之后,我得到了以下异常。我不确定jboss-deployment-structure.xml是否正确,是否将其放置在正确的文件夹中。你能帮忙吗?
ERROR [io.undertow.request] (default task-5) UT005023: Exception handling request to /AD/control/UploadEstimates: java.lang.IllegalAccessError: tried to access class com.microsoft.sqlserver.jdbc.Util from class com.microsoft.sqlserver.jdbc.SQLServerDataTable at com.microsoft.sqlserver.jdbc.SQLServerDataTable.addColumnMetadata(SQLServerDataTable.java:83) at com.MyClient.AD.util.UploadEstimateUT.start(UploadEstimateUT.java:66) at com.MyClient.AD.util.UploadEstimates.doPost(UploadEstimates.java:107) at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74) at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68) at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132) at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60) at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77) at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50) at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292) at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135) at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48) at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43) at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1514) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1514) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1514) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1514) at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272) at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81) at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104) at io.undertow.server.Connectors.executeRootHandler(Connectors.java:360) at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830) at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378) at java.lang.Thread.run(Thread.java:748) ``` 更新2020年3月16日 这是我使用批处理语句更新的代码:
public String executeInboundEstimateBatchedStoredProc(int iClientID, SQLServerDataTable sourceDataTable) {
String message="";
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = super.getConnection();
String execStoredProc = "EXEC UploadEstimate ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?";
PreparedStatement pStmt = con.prepareStatement(execStoredProc);
Iterator<Entry<Integer, Object[]>> itr1 = sourceDataTable.getIterator();
while (itr1.hasNext()) {
Object[] lst= itr1.next().getValue();
int numColumns = lst.length;
pStmt.setInt(1, iClientID);
for (int i = 0; i < numColumns; i++) {
pStmt.setString(i+2, lst[i].toString());
}
// add single insert query
pStmt.addBatch();
}
// Execute batch
int[] counts = pStmt.executeBatch();
if (pStmt != null) {
pStmt.close();
}
if (con != null) {
con.close();
}
}
// Handle any errors that may have occurred.
catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
message=e.getMessage();
}
return message;
}
```
问题来源:Stack Overflow
U永远不必检查连接对象的准备好的语句的返回类型。依赖于平台的基础驱动程序可以提供自己准备的语句INTERFACE的实现,这与用户无关。U应该仅使用该接口提供的公共方法,而不能进行任何进一步的挖掘。在您的情况下,您没有错误,只需将ur语句转换为一般类型即可。PreparedStatement pStm = con.prepareStatememt(execStoredProc)如果您处理的是我从execStoredProc假定的过程,则使用con.prepareCall()并存储在Callable Statement类型中
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。