我在Weblogic中创建了一个用户名为“sa”的SQLServer数据源。
在代码中我使用以下来获取用户名。
Context ctx = new InitialContext(prop);
Object obj = ctx.lookup("sqlserver1");
System.out.println("Data Source Found….");
DataSource ds = (DataSource) obj;
Connection conn = ds.getConnection();
DatabaseMetaData mtdt = conn.getMetaData();
// Get UserName
System.out.println("User name: " + mtdt.getUserName());
但是上面的代码总是返回'dbo'作为用户名。我希望用户名为'sa'。如果数据库是Oracle,它可以正常工作。我是否有通用的方法来获取所有不同类型数据库的用户名。
答案 0 :(得分:4)
正确的方法应该是DatabaseMetaData.getUserName()
,但正如您所示,并非所有数据库都能正确实现。另一种方法是使用JDBC函数escape USER()
例如(例如SELECT {fn USER()} FROM DUAL
),但并非所有驱动程序都实现所有JDBC转义,并且它可能只是返回与{{1}相同的}。您还可以在查询中尝试定义DatabaseMetaData
(或CURRENT_USER
)的SQL标准,但是您有两个问题:1)某些数据库要求您从表中进行选择(例如USER
在Oracle中,有些不这样做)和2)并非所有数据库都实现了SQL标准的所有部分,因此DUAL
或CURRENT_USER
上下文变量可能不存在。
但是,当您拥有DataSource对象时,您可以尝试从数据源获取USER
属性(它在JDBC 4.1规范的表9.1中定义,尽管其中描述的属性名称并非都是必需的)
例如:
user
这假设1)Method getter = new PropertyDescriptor("user", ds.getClass()).getReadMethod();
String value = (String) getter.invoke(ds);
具有DataSource ds
和2)它实际上已设置(例如,使用SQL Server集成安全性,数据源不需要了解用户)。
答案 1 :(得分:1)
FWIW,Java 1.7提供了Connection.getSchema()方法。我不知道1.7在这一点上采用了多大的1.7,所以这可能只是需要记住以供将来参考。