oracle.jdbc에 연결을 캐스트할 수 없습니다.오라클 연결
java.sql을 선택해야 합니다.oracle.jdbc에 연결을 캐스트할 수 없습니다.아래 코드의 Oracle Connection?
제 주요 목표는 Oracle 연결에 새 사용자 이름을 전달하여 'OSuser' 열과 같은 'SESSION' 테이블에 저장하는 것입니다. DB 사용자 변경 내용을 추적하여 테이블에 표시하고 싶기 때문입니다.
@Repository
public class AuditLogDAOImpl implements AuditLogDAO {
@PersistenceContext(unitName="myUnitName")
EntityManager em;
@Resource(name = "dataSource")
DataSource dataSource;
public void init() {
try {
Connection connection = DataSourceUtils.getConnection(dataSource);
OracleConnection oracleConnection = (OracleConnection) connection; //Here I got cast exception!
String metrics[] = new String[OracleConnection.END_TO_END_STATE_INDEX_MAX];
metrics[OracleConnection.END_TO_END_CLIENTID_INDEX] = "my_new_username";
oracleConnection.setEndToEndMetrics(metrics, (short) 0);
java.util.Properties props = new java.util.Properties();
props.put("osuser", "newValue");
oracleConnection.setClientInfo(props);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
다음은 오류 로그입니다.
10:42:29,251 INFO [STDOUT] org.jboss.resource.adapter.jdbc.jdk6.WrappedConnectionJDK6@bcc8cb
10:42:51,701 ERROR [STDERR] java.lang.ClassCastException: $Proxy286 cannot be cast to oracle.jdbc.OracleConnection
이 경우 일반적으로 두 가지 문제가 있습니다.
- Connection에서 Oracle Connection으로의 캐스트가 실패하는 이유
- 내 의도를 구현하는 가장 좋은 방법은 무엇입니까(즉, Oracle DB에서 새 사용자 이름을 v$session.osuser로 설정)?
저는 jndi를 통해 Oracle 11g, Hibernate(엔티티 관리자 사용), 데이터 소스를 사용합니다.
도와주세요, 감사합니다!
편집:
어느 정도 개선된 후에도 주조 관련 문제는 여전히 존재합니다.
개선:
Connection connection = DataSourceUtils.getConnection(dataSource);
connection = ((org.jboss.resource.adapter.jdbc.WrappedConnection)connection).getUnderlyingConnection();
OracleConnection oracleConnection = (OracleConnection) connection;
오류:
java.lang.ClassCastException: $Proxy287 cannot be cast to org.jboss.resource.adapter.jdbc.WrappedConnection
검색 중인 연결이 래핑된 연결일 수 있습니다.
기본 Oracle 연결이 필요한 경우 다음을 사용해야 합니다.
if (connection.isWrapperFor(OracleConnection.class)){
OracleConnection oracleConnection= connection.unwrap(OracleConnection.class);
}else{
// recover, not an oracle connection
}
그isWrapperFor
그리고.unwrap
메서드는 Java 1.6부터 사용할 수 있으며 A/S 연결 래퍼에 의해 의미 있게 구현되어야 합니다.
일반적으로 연결 풀에는 실제 연결 인스턴스 주위에 래퍼가 있으므로 캐스트가 실패합니다.
속성 인스턴스의 매개 변수는 연결이 설정된 경우에만 확인되므로 수행 중인 작업이 작동하지 않습니다.이미 활성화된 연결이 있으므로 변경되지 않습니다.
기존 연결에 대해 이 설정을 변경하려면 를 사용해야 합니다.
Oracle Connection에서 메트릭을 설정하는 방법에 대한 검색을 통해 방문하는 사용자를 위한 것입니다. 저는 이 작업에 많은 시간을 할애하므로 누군가를 도울 수 있습니다.
"연결"이 완료되면 다음 작업이 수행됩니다.
DatabaseMetaData dmd = connection.getMetaData();
Connection metaDataConnection = null;
if(dmd != null)
{
metaDataConnection = dmd.getConnection();
}
if(!(metaDataConnection instanceof OracleConnection))
{
log.error("Connection is not instance of OracleConnection, returning");
return; /* Not connection u want */
}
OracleConnection oraConnection = (OracleConnection)metaDataConnection;
String[] metrics = new String[END_TO_END_STATE_INDEX_MAX]; // Do the rest below...
Oracle Connection에서는 작동하지만 메트릭을 설정할 때 다음과 같은 문제가 발생합니다.
short zero = 0;
oraConnection.setEndToEndMetrics(metrics, zero);
메트릭을 몇 번 설정한 메서드를 통해 연결을 프록시하면 다음과 같은 메시지가 표시됩니다.
java.sql.SQLRecoverableException: No more data to read from socket
하지만 제 생각에는 그것의 스프링 배선이나 연결 풀과 관련이 있는 것 같습니다.
저는 스프링을 사용하여 연결을 얻을 때 이 문제에 직면했습니다.일반적으로 각 계층은 기본 클래스에 래퍼를 추가합니다.저는 방금 connection.getClass().getName()을 수행하여 재튜닝 중인 연결의 런타임 유형을 확인했습니다.기본 Oracle Connection 유형을 가져오는 방법을 쉽게 찾을 수 있는 Wrapper/proxy가 될 것입니다.
다음을 시도해 보십시오.
저는 같은 문제에 직면했습니다.스프링을 사용하고 있었는데 NativeJdbc Extractor라는 클래스가 있습니다.많은 구현이 있으며 다음 구현은 TomCat에서 작동합니다.JBoss NativeJdbc Extractor라고 하는 Jboss를 위한 특정 구현이 있습니다.
<bean id="jdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"></bean>
DAO에서 콩을 주입하고 다음 방법을 사용할 수 있습니다.
protected NativeJdbcExtractor jdbcExtractor;
Connection conn=jdbcExtractor.getNativeConnection(oracleConnection);
래퍼 유형이 NewProxyConnection인 경우 래퍼 내의 내부 Oracle 개체에 액세스할 수 있습니다.
(제 프로젝트에서 사용해 본 적이 있습니다. 효과가 있었습니다... 미스테리 없이, 그냥 반사만 사용하세요.)
Field[] fieldsConn= connection.getClass().getDeclaredFields();
Object innerConnObject = getFieldByName(fieldsConn,"inner").get(connection);
if(innerConnObject instanceof OracleConnection ){
OracleConnection oracleConn = (OracleConnection)innerConnObject;
//OracleConnection unwrap = ((OracleConnection)innerConnObject).unwrap();
// now you have the OracleObject that the Wrapper
}
//Method: Set properties of the ooject accessible.
public static Field getFieldByName(Field[] campos, String name) {
Field f = null;
for (Field campo : campos) {
campo.setAccessible(true);
if (campo.getName().equals(name)) {
f = campo;
break;
}
}
return f;
}
내 상황이 관련되어 있는지는 모르겠지만, 내 프로젝트에서 데이터베이스 구성 설정을 변경하는 것만으로도 실제로 랩 해제가 실패합니다!
Scala와 함께 Play 프레임워크를 사용하고 있습니다. 이는 logSql=false:
db.withConnection { implicit c =>
val oracleConnection = c.unwrap(classOf[OracleConnection])
}
(이것은 Oracle Connection의 포장을 푸는 Scala 버전일 뿐입니다.)
logSql=true를 설정하면 다음과 같은 메시지가 표시됩니다.
com.sun.sun.sun.sun.sun.sun$Proxy17을 oracle.jdbc에 캐스팅할 수 없습니다.Oracle Connection java.lang입니다.ClassCastException: com.sun.proxy.$Proxy17을 oracle.jdbc에 캐스팅할 수 없습니다.오라클 연결
따라서 logSql 구성과 관련하여 실제로 언랩이 실패할 수 있습니다.왜 그런지 모르겠어요.
두 구성 중 하나를 사용할 경우 연결 개체는 다음과 같습니다.
HikariProxyConnection@1880261898 랩핑 oracle.jdbc.driver.T4C연결@6b28f065
isWrapperFor(OracleConnection)
됩니다.
이것은 히카리 연결 풀 및 Bone CP에서 발생합니다.Oracle JDBC의 버그일 수도 있습니다.
매니페스트.MF에 따른 Oracle JDBC 드라이버 버전
버전: 파일: 11.2.0.3.0
파일 이름: JAVAVM_11.2.0.4.0_LINUX.X64_130711
시행착오 끝에.이 방법은 다음과 같습니다.
DelegatingConnection delConnection = new DelegatingConnection(dbcpConnection);
oraConnection = (oracle.jdbc.OracleConnection)delConnection.getInnermostDelegate();
그러나 이 방법은 oraConnection:에 대한 null 포인터를 반환했습니다.
DelegatingConnection delConnection = (DelegatingConnection) dbcpConnection;
oraConnection = (oracle.jdbc.OracleConnection)delConnection.getInnermostDelegate();
다음은 AQ의 TopicConnection.getTopicSession => JMS-112를 우회하기 위해 작동했습니다.
//DEBUG: Native DataSource : weblogic.jdbc.common.internal.RmiDataSource
con = DataSource.getConnection();
debug("Generic SQL Connection: " + con.toString());
//DEBUG: Generic Connection: weblogic.jdbc.wrapper.PoolConnection_oracle_jdbc_driver_T4CConnection
if (con != null && con.isWrapperFor(OracleConnection.class)) {
WebLogicNativeJdbcExtractor wlne = new WebLogicNativeJdbcExtractor();//org.springframework to the rescue!!
java.sql.Connection nativeCon = wlne.getNativeConnection(con);
this.oraConnection = (OracleConnection) nativeCon;
debug("Unwrapp SQL Connection: " + this.oraConnection.toString());
}
//DEBUG: Native Connection: oracle.jdbc.driver.T4CConnection è
이제 저는 이것을 JMS-112가 없는 AQ-Factory에서 사용할 수 있습니다.
아래와 같은 캐스팅을 시도합니다.
WrappedConnectionJDK6 wc = (WrappedConnectionJDK6) connection;
connection = wc.getUnderlyingConnection();
언급URL : https://stackoverflow.com/questions/15483356/connection-cannot-be-cast-to-oracle-jdbc-oracleconnection
'bestsource' 카테고리의 다른 글
rest와 함께 부울 값을 반환하는 방법은 무엇입니까? (0) | 2023.07.08 |
---|---|
Spring Web Client를 사용하여 여러 전화를 동시에 거는 방법은 무엇입니까? (0) | 2023.07.08 |
계산된 속성이 서로 다른 탭에서 UI를 업데이트하지 않음 (0) | 2023.07.08 |
자바.java.java잘못된 상태 예외:로드 밸런싱에 대한 페이그니 클라이언트가 정의되지 않았습니다.봄-구름-스타터-넷플릭스-리본을 포함하는 것을 잊으셨습니까? (0) | 2023.07.08 |
대규모 분산 시스템에서 ObjectId와 UUID의 충돌 확률 (0) | 2023.07.08 |