2010-05-10 8 views
5

J'ai une application spring/jdbc/oracle 10g. Le fuseau horaire de la base de données du serveur Oracle est défini sur GMT + 2 Le fuseau horaire de la JVM est GMT + 2 (même si cela n'a pas d'importance dans mon cas).Réglage du fuseau horaire de la session avec le ressort jdbc oracle

J'ai une procédure stockée qui effectue certaines opérations de date. Le problème est que le fuseau horaire de la session est différent (GMT) que le fuseau horaire de la base de données, même si je ne définis pas explicitement le fuseau horaire de la session dans mon code/configuration. Pour autant que je sache, le fuseau horaire de la session est par défaut égal au fuseau horaire de la base de données. Une idée pourquoi le fuseau horaire de la session est différent du fuseau horaire de la base de données ou comment est-ce que je peux le configurer dans la configuration de ressort (org.apache.commons.dbcp.BasicDataSource)?

Merci.

+1

De quelle session parlez-vous? Session de connexion Oracle ou session HTTP? Le premier, je suppose? – skaffman

+0

Cela résout votre problème? Je dois faire la même chose sur MySQL et je cherche toujours comment le faire! –

+0

J'ai des questions/messages qui restent dans ce mode DEAD !! Pas de réponses, pas de confirmations, pas de spéculations !! –

Répondre

6

La méthode correcte consiste à utiliser DelegatingDataSource, récupérer OracleConnection objet à partir de la source de données d'origine et appeler OracleConnection.setSessionTimeZone() avec le paramètre approprié.

code C3P0 ressemble:

private Object[] timeZoneArgs = new Object[] { "Europe/Berlin" }; 

@Override 
public Connection getConnection() throws SQLException { 
    Connection conn = super.getConnection(); 
    try { 
     final Method setSessionTimeZoneMethod = OracleConnection.class.getMethod("setSessionTimeZone", String.class); 
     final C3P0ProxyConnection castCon = (C3P0ProxyConnection) conn; 
     castCon.rawConnectionOperation(setSessionTimeZoneMethod, C3P0ProxyConnection.RAW_CONNECTION, timeZoneArgs); 
     return conn; 
    } catch (Exception e) { 
     log.error("setSessionTimeZone failed " + e.getMessage()); 
     return conn; 
    } 
} 
1

Je résolu ce problème en mettant à jour les pilotes JDBC d'Oracle de v10.2.0.1.0 à v11.2.0.3. Aucun changement à mon code java n'était requis.

Source: Spring forums.