GlassFish 3.1.1 - получение соединения jdbc - PullRequest
1 голос
/ 26 сентября 2011

Я пытаюсь получить OracleConnection от glassfish следующими строками:

EntityManager em = getEntityManager();
Connection c = em.unwrap(Connection.class);

Но в отладчике я вижу, что фактический класс для c - это класс ConnectionHolder40.Где я могу найти банку с определением ConnectionHolder40?

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Можно получить только интерфейсы. Если вы используете интерфейс Connection, вы получите первую оболочку в иерархии, которая реализует Connection, так что в этом случае ConnectionHolder40. Если вы хотите получить OracleConnection - и я вижу здесь , что это интерфейс, вы должны запросить его.

Но вам нужен драйвер JDBC4. С драйверами JDBC3 могут возникнуть проблемы (как у меня с Informix 3.70), потому что они не реализуют методы unwrap и isWrapperFor, а также ConnectionHolder40, * StatementWrapper40 и ResultSetWrapper40 не реализованы правильно. Если я хочу развернуть IfmxConnection от держателя, я могу. Но я не могу спросить владельца, является ли он оболочкой для IfmxConnection - это вызывает исключение, потому что он пытается запросить реализацию драйвера: ConnectionHolder40 . StatementWrapper и ResultSetWrapper выдают исключение из обоих методов, если они непосредственно не реализуют интерфейс (точнее, если вы не запрашиваете java.sql. * Оператор или java.sql.ResultSet).

1 голос
/ 14 декабря 2012

Попробуйте

public OracleConnection getOracleConnection(Connection connection) throws SQLException {
    OracleConnection oconn = null;
    try {
        if (connection.isWrapperFor(oracle.jdbc.OracleConnection.class)) {
            oconn = (OracleConnection) connection.unwrap(oracle.jdbc.OracleConnection.class)._getPC();
        }
    } catch (SQLException e) {
        throw e;
    }
    return oconn;
}
0 голосов
/ 26 сентября 2011

java.sql.Connection - это интерфейс, ConnectionHolder40 - это просто оболочка соединения, используемая Glassfish, вероятно, это сгенерированный класс, поэтому он не будет ни в одном jar-файле.

Вы должны использовать толькоAPI соединения, поэтому не должен нуждаться в классе.

JDBC также поддерживает API развертывания, если вы хотите получить настоящее соединение с драйвером JDBC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...