2010-12-04 54 views
8

我正在使用Hibernate 3.x和Jboss。 目前我們支持多個數據庫。如何從休眠提供程序知道底層數據庫名稱

現在在運行時,我怎麼能知道底層的數據庫信息?至少是名字還是數據庫方言? (例如MySQL,Derby,Oracle等)?

任何人都可以建議任何方式來找到這些信息? 我以爲hibernate的SessionFactory類會提供這樣的API - 但它不是?

由於提前,

+0

可能的重複:http://stackoverflow.co m/questions/821466/how-can-i-get-the-database-name -i-am-connected-through-hibernate – javamonkey79 2010-12-04 01:55:39

回答

1

既然你有一張hibernate.properties或hibernate.cfg.xml文件中,你可以閱讀永諾關閉這些文件的任何信息。

8

我認爲你可以這樣來做:

sessionFactory.getCurrentSession().connection().getMetaData().getURL() 
+2

請注意,此方法會在不關閉的情況下創建一個廢棄的連接。 – DanielK 2016-09-27 12:31:47

7

非常感謝javamonkey79和斯特凡諾爲應對這一問題。

是的 - 我可以讀取hibernate.properties/cfg.xml文件 - 但我想避免文件讀取工作流程。

看來Session::connection() api現在已被棄用,但它仍然有效。 我們也可以用下面列出的其他方法檢索相同的信息。

OPTION 1

Session session = sessionFactory.openSession(); 
String dbURL = session.connection().getMetaData().getURL().toString(); 
session.close(); 

OPTION 2

Settings settings = ((SessionFactoryImpl) sessionFactory).getSettings(); 
if (settings != null) { 
    Connection connection = settings.getConnectionProvider().getConnection(); 
    String dbURL = connection.getMetaData().getURL(); 
    connection.close(); 
} 

對於MySQL,返回URL將在形式:

jdbc:mysql://localhost:3306/edm?useUnicode=true 
3
sessionFactory.getDialect(); 

給你Dialect

sessionFactory.getSettings().getConnectionProvider().getConnection().getMetaData().getURL(); 

爲您提供連接網址。

注意:這隻與SessionFactoryImpl類的工作,不與接口

3

或者你可以嘗試:

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); 
SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) sessionFactory; 
Properties props = sessionFactoryImpl.getProperties(); 
String url = props.get("hibernate.connection.url").toString(); 
String[] urlArray = url.split(":"); 
String db_name = urlArray[urlArray.length - 1]; 
+0

我希望這將是我可以看到所有Hibernate屬性的一種方式,但它似乎只在從文件hibernate.cfg.xml中讀取配置時才起作用。我使用Spring來配置Hibernate,因此它不起作用。任何想法如何訪問由Spring創建的SessionFactoryImpl? – 2015-04-12 04:21:21

1

,你可以試試這個代碼:

String url = null; 
try { 
    url = getSession().connection().getMetaData().getURL().toString(); 
} catch (HibernateException e) { 
    e.printStackTrace(); 
} catch (SQLException e) { 
    e.printStackTrace(); 
} 
String[] urlArray = url.split(":"); 
String db_name = urlArray[1]; 

;)