У меня есть код Java, который использует JDBC для подключения к двум базам данных моей компании.Администратор дал мне оба разрешения как проверка подлинности Windows .Я могу подключиться и взаимодействовать с обеими базами данных с помощью SQL Server Managment Studio.Проблема в том, что я могу работать только с первой базой данных с JDBC в java, потому что попытка соединиться со второй базой данных приводит к ошибке «не удается открыть базу данных» .
Это странно, потому что я могу отлично работать с первой базой данных, и главный сервер обеих баз данных одинаков.У меня есть драйверы JDBC и файл sqljdbc_auth.dll
, необходимый для аутентификации Windows.Я использовал модульные методы, чтобы избежать ошибок типа.Вот код (я изменил некоторые символы в XXX по соображениям безопасности):
package Auto;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import org.testng.annotations.Test;
public class Test7
{
private final static int PORT = 1441;
/**
* This is the method that executes the connections
* @throws Exception
*/
@Test
public void test()
{
try
{
// === Correct connection with server 1 === //
String server1Name = "XXXXVPRUBDSQL01\\XXXXDCESQL";
String databaseName1 = "FacturaElectronicav2";
String urlServer1 = getURLforconnection(server1Name, databaseName1);
Connection conn1 = startSQLconnection(urlServer1);
String table = "dbo.UsersExternal";
String searcher = "Email";
String searcherValue = "User@gmail.com";
String column = "TokenCode";
String dato = obtainValueFromStatement(conn1, table, searcher, searcherValue, column);
System.out.println("");
System.out.println("URL connection: " + urlServer1);
System.out.println("The conenction was created succesful because this was printed");
System.out.println("Value: " + dato + " // The value obtained from the statement is correct");
System.out.println("");
closeSQLConnection(conn1);
System.out.println("Here goes the connection failure in the second database");
System.out.println("");
// === SECOND DATABASE=== //
String server2Name = "XXXXVPRUBDSQL01\\XXXXDSSINTSQL";
String databaseName2 = "SISECPrueba";
String urlServer2 = getURLforconnection(server2Name, databaseName2);
// Here the connection fails
Connection conn2 = startSQLconnection(urlServer2);
}
catch ( Exception e )
{
// Here the catch handles the exception while trying to connect to the second database
e.printStackTrace();
}
}
/**
* Method that creates the url for the connection to the database
* It uses Windows Authentication [integratedSecurity=true]
* @param serverName Name of the server connection
* @param databaseName Name of the database of the server
* @return The url for the JDBC connection
*/
public String getURLforconnection(String serverName, String databaseName)
{
String url = "jdbc:sqlserver://"+serverName+":"+PORT+";databaseName="+databaseName+";integratedSecurity=true";
return url;
}
/**
* Creates the connection with the database
* @param URL URL for the JDBC connection
* @throws Exception
*/
public Connection startSQLconnection(String URL) throws Exception
{
Connection conn = DriverManager.getConnection(URL);
return conn;
}
/**
* Closes the connection with the database
* @throws Exception
*/
public void closeSQLConnection(Connection Con) throws Exception
{
Con.close();
}
/**
* Returns the value searched in the database by the parameters
* @param Table Table where the value is
* @param Searcher Identifier of the search
* @param SearcherValue Value of the identifier
* @param Column Column of the table
* @return The value of the statement
* @throws Exception
*/
public String obtainValueFromStatement(Connection Con, String Table, String Searcher, String SearcherValue, String Column) throws Exception
{
String answer = "";
String SQLstatement = "SELECT * FROM " + Table + " WHERE " + Searcher + " = '" + SearcherValue + "'";
Statement statement = Con.createStatement();
ResultSet rs = statement.executeQuery(SQLstatement);
if(rs.next()) { answer = rs.getString(Column); }
else { throw new Exception("It can not be found a registry in the statement"); }
statement.close();
rs.close();
return answer;
}
}
Ожидаемый результат - правильное соединение с обеими базами данных.Тем не менее, только первое соединение успешно, и значение, полученное из таблицы базы данных, печатается, в то время как второе не удается, как показано в выводе консоли:
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TestSuite
URL connection: jdbc:sqlserver://XXXXVPRUBDSQL01\XXXXDCESQL:1441;databaseName=FacturaElectronicav2;integratedSecurity=true
The conenction was created succesful because this was printed
Value: 1CE9AAB6-DEC4-481F-81E9-45DAB1D018CC // The value obtained from the statement is correct
Here goes the connection failure in the second database
com.microsoft.sqlserver.jdbc.SQLServerException: Cannot open database "SISECPrueba" requested by the login. The login failed. ClientConnectionId:d122e604-a8e2-4fa7-b1dc-aec3f6e6d9fd
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:213)
at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:246)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:83)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:2908)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:2242)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:41)
at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:2228)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5574)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1734)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1355)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:1022)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:858)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:270)
at Auto.Test7.startSQLconnection(Test7.java:86)
at Auto.Test7.test(Test7.java:56)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:648)
at org.testng.TestRunner.run(TestRunner.java:505)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
at org.testng.SuiteRunner.run(SuiteRunner.java:364)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
at org.testng.TestNG.runSuites(TestNG.java:1049)
at org.testng.TestNG.run(TestNG.java:1017)
at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:283)
at org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:75)
at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:120)
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:373)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:334)
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:119)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:407)
Кажется, что проблема связана с подключениембаза данных SISECPrueba второго сервера, потому что экземпляр сервера правильный.
Наконец, как я уже говорил, у меня есть обычный доступ к обоим серверам с помощью приложения Windows SQL Server Managment Studio.