Connect to oracle database, knowing only the database name - java

I have an existing connection in R, where I use DBI library to do the following:
con <- dbConnect(drv, username = "user", password = "pass", dbname = "mydatabase.world")
This creates the following connection:
User name: user
Connect string: mydatabase.world
Server version: 11.2.0.4.0
Server type: Oracle RDBMS
Results processed: 0
OCI prefetch: FALSE
Bulk read: 25
Statement cache size: 0
LOB prefetch size: 1024
Open results: 0
I would like to do the same thing in Java. I browsed lots of tutorials, and arrived at this:
private static Connection getDBConnection() {
Connection dbConnection = null;
try {
Class.forName(DB_DRIVER);
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
try {
dbConnection = DriverManager.getConnection(DB_CONNECTION, DB_USER,
DB_PASSWORD);
return dbConnection;
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return dbConnection;
}
but I get this error:
The Network Adapter could not establish the connection
I could connect just with database name in R, how to do the same thing in Java?
My current DB_CONNECTION string is:
private static final String DB_CONNECTION = "jdbc:oracle:thin:#mydatabase.world";
tnsping:
Message 3511 not found; No message file for product=NETWORK, facility=TNSMessage
3512 not found; No message file for product=NETWORK, facility=TNSAttempting to
contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (COMMUNITY = tcp.world)(PROTOC
OL = TCP)(Host = 10.3.0.70)(Port = 1532))) (CONNECT_DATA = (SID = LUCAS)))
Message 3509 not found; No message file for product=NETWORK, facility=TNS'
Solution
For whatever reason, I could not use the database name in Java. Here is what I had to do:
Run tnsping (found in oracle directory, BIN subdirectory) with the database name as parameter
tnsping mydatabase.world
Then from there I got my host name and SID
The string is now:
String DB_CONNECTION = "jdbc:oracle:thin:#10.3.0.70:1532:LUCAS";

knowing only the database name
I don't really understand, according to your R code it seems to me that DB_USER = "user" and DB_PASSWORD = "pass".
Also did you try adding the port and the SID to your DB_CONNECTION String ?
private static final String DB_CONNECTION = "jdbc:oracle:thin:#10.3.0.70:1532:LUCAS";
I edited my post with your tnsping info.

If i understood corectly you are not sure about connection parameters as hosthame and port.
It seems that mydatabase.world is a dsn name. So parameters you needed can be located at dsn: /etc/odbc.ini or /etc/odbcinst.ini

Related

Can connect to MySQL db with java but not with PHP?

I have a java application, that can connect to an online MySQL database, like this:
private String hostName = "db4free.net:3306";
private String dbName = "mydbname";
private String username = "name";
private String password = "pw";
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://" + hostName + "/" + dbName, username, password);
System.out.println("Connection established!");
} catch (Exception ex) {
ex.printStackTrace();
}
It works perfectly. However, I try the same with PHP (ignore hostname difference, this should be it):
$host = "85.10.205.173";
$dbname = "dbname";
$username = "name";
$password = "pw";
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
try
{
// Open connection with db
$db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options);
}
catch(PDOException $ex)
{
// Just an error message, if connection fails
die("Failed to connect to the database: " . $ex->getMessage());
}
And after a while, I get this: SQLSTATE[HY000] [2003] Can't connect to MySQL server on '85.10.205.173' (4)
So why do the two work differently? I think that remote access is enabled (because I could connect with java).
Disable the DNS hostname lookups in mysql
To disable DNS host name lookups, start the server with the --skip-name-resolve option. In this case, the server uses only IP addresses and not host names to match connecting hosts to rows in the MySQL grant tables. Only accounts specified in those tables using IP addresses can be used.
Don't forget to restart MySQL to take effect.
Not sure this will solve your problem.

communication link failure in java

when i ll try to connecting mysql using jdbc means its succeessfully connected on localhost.but i replaced localhost by my ip address means itz not connected..y dis error is came..how it is cleared..help me.
dis is my coding:
package com.retrieve;
import java.sql.*;
public class retrieve{
public static void main(String[] args) {
System.out.println("Getting All Rows from a table!");
Connection con = null;
String url = "jdbc:mysql://192.168.1.249:3306/";
String db = "login";
String driver = "com.mysql.jdbc.Driver";
String user = "root";
String pass = "";
try{
Class.forName(driver).newInstance();
con = DriverManager.getConnection(url+db, user, pass);
try{
Statement st = con.createStatement();
ResultSet res = st.executeQuery("SELECT * FROM login");
System.out.println("username: " + "\t" + "password: ");
while (res.next()) {
String s = res.getString("username");
String s1 = res.getString("password");
System.out.println(s1 + "\t\t" + s);
}
con.close();
}
catch (SQLException s){
System.out.println("SQL code does not execute.");
}
}
catch (Exception e){
e.printStackTrace();
}
}
}
The error is:
Getting All Rows from a table!
java.sql.SQLException: Data source rejected establishment of connection, message from server: "Host '192.168.1.249' is not allowed to connect to this MySQL server"
at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:650)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:1808)
at com.mysql.jdbc.Connection.(Connection.java:452)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:411)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at com.retrieve.retrieve.main(retrieve.java:15)
With your MySQL server you need to add permission for your user to be able to access your db from the specified IP
Execute following query from mysql console
GRANT ALL ON YOUR_DB.* TO 'root'#'192.168.1.249';
create user 'login'#'192.168.1.249' on your mysql server.
mysql builds users from 'name' (here - login you specified) and 'host' (address from which user connects to server). You can use '%' char to describe 'all hosts'.
consider reading this section of docs:
http://dev.mysql.com/doc/refman/5.1/en/user-account-management.html
Try to close all the resources like Statment, ResultSet objects etc.Also, as #Jigar mentione, grant permission to the users as well.
Please check your port .If you changed your port number ,you got this error like
"com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure"

How to access the another system mysql database through java program?

How to access the another system mysql database through java program?Am using the following program but i have get the communication error?what are the changes are need to connect the another system mysql database?
Public void dbconnection() {
String name = "";
String port = "3306";
String user = "system";
String pass = "system";
String dbname = "cascade_demo";
String host="192.168.1.61";
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://"+host+":"+ port + "/" + dbname;
System.out.println("URL:" + url);
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection(url, user, pass);
String qry2 = "select * from item_master";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(qry2);
while (rs.next()) {
name = rs.getString(1);
System.out.println("Name:" + name);
}
rs.close();
st.close();
con.close();
} catch (Exception e) {
System.out.println("Exception:" + e);
}
}
You're not creating an instance of the driver class:
Class.forName("com.mysql.jdbc.Driver").newInstance();
[update: not necessary after all, ignore that]
And you're also referencing "sun.jdbc.odbc.JdbcOdbcDriver", is that necessary? If so, shouldn't you instantiate it also? [update: probably not]
If it works with localhost, and not with the IP specified, you need to configure mysql to listen on all ports.
jcomeau#intrepid:/tmp$ cat dbconnection.java; javac dbconnection.java; sudo java -cp .:/usr/share/maven-repo/mysql/mysql-connector-java/5.1.16/mysql-connector-java-5.1.16.jar dbconnection
import java.sql.*;
public class dbconnection {
public static void main(String args[]) {
String name = "";
String port = "3306";
String user = "root";
String pass = "";
String dbname = "imagetagging";
String host="127.0.0.1";
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url = "jdbc:mysql://"+host+":"+ port + "/" + dbname;
System.out.println("URL:" + url);
//Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection(url, user, pass);
String qry2 = "select * from taggers";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(qry2);
while (rs.next()) {
name = rs.getString(1);
System.out.println("Name:" + name);
}
rs.close();
st.close();
con.close();
} catch (Exception e) {
System.out.println("Exception:" + e);
}
}
}
URL:jdbc:mysql://127.0.0.1:3306/imagetagging
Name:1
Name:2
Name:3
Name:4
Name:5
Name:6
Name:7
Name:8
Name:9
Name:10
Name:11
Name:12
Name:13
Name:14
Name:15
Name:16
Name:17
Name:18
Name:19
Name:20
Name:21
As I understand you just need to specify another connection string, with another host and other credentials, e.g.:
...
String port = "3306";
String user = "user_name";
String pass = "password";
String dbname = "db_name";
String host="host_name";
...
You have to do 3(with 4th step optional) simple things to connect to your remote mysql database server.
Open up any GUI tool for mysql database management (your IDE, Mysql Workbench or smth else), check if you can connect to your database by specifying your credentials, host, port and database name.
If that succeeds you know there is nothing wrong on the db part (go to 3), if not, and you are sure you do everything correctly up to this point go to point 2.
check out this post on how to enable remote access to your db and try again (go to pkt 1)
You would have to clean up a bit your code, have a look into simple and to the point tutorial on how to connect and execute simple sql statements with java on Vogella tutorial
Once everything is working correctly, remember to give +1 on Vogella tutorial, praise the cybercity or any other website for the explanation on how to enable remote access on you db and don't forget to come back to stackoverflow and reward all good answers :)

Access mysql data base from another system using java

I am working on a interface in java swing.we have four system connected with a lan.the interface is for accessing the database from the other system in the same local area network i used the following code to access the database by giving the ip address,database name,tablename but i could not connect the other systems database.how can i do this?
public void dbconnection() {
String name = "";
String port = "3306";
String user = "systech";
String pass = "systech";
String dbname = "cascade_demo";
String host="192.168.1.61";
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://"+host+":"+ port + "/" + dbname;
System.out.println("URL:" + url);
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection(url, user, pass);
String qry2 = "select * from item_master";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(qry2);
while (rs.next()) {
name = rs.getString(1);
System.out.println("Name:" + name);
}
rs.close();
st.close();
con.close();
} catch (Exception e) {
System.out.println("Exception:" + e);
}
}
Use below code
public void dbconnection() {
String name = "";
String port = "3306";
String user = "systech";
String pass = "systech";
String dbname = "cascade_demo";
String host="192.168.1.61";
try {
String url = "jdbc:mysql://"+host+":"+ port + "/" + dbname;
Class.forName("com.mysql.jdbc.Driver").newInstance ();
Connection con = DriverManager.getConnection(url, user, pass);
String qry2 = "select * from item_master";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(qry2);
while (rs.next()) {
System.out.println("Name:" + rs.getString(1));
}
rs.close();
st.close();
con.close();
} catch (Exception e) {
System.out.println("Exception:" + e);
}
}
Also, make sure to include jar file for connecting. You will get jar file here.
Update 1:
So, you have a
CommunicationsException: Communications link failure
I'm quoting from this answer which also contains a step-by-step MySQL+JDBC tutorial:
If you get a SQLException: Connection refused or Connection timed out or a MySQL specific CommunicationsException:
Communications link failure, then it means that the DB isn't reachable at all. This can have one or more of the following causes:
IP address or hostname in JDBC URL is wrong.
Hostname in JDBC URL is not recognized by local DNS server.
Port number is missing or wrong in JDBC URL.
DB server is down.
DB server doesn't accept TCP/IP connections.
DB server has run out of connections.
Something in between Java and DB is blocking connections, e.g. a firewall or proxy.
To solve the one or the other, follow the following advices:
Verify and test them with ping.
Refresh DNS or use IP address in JDBC URL instead.
Verify it based on my.cnf of MySQL DB.
Start the DB.
Verify if mysqld is started without the --skip-networking option.
Restart the DB and fix your code accordingly that it closes connections in finally.
Disable firewall and/or configure firewall/proxy to allow/forward the port.
Update 2
If your system is Windows, go to Start>>Run.
Type command. This will open command prompt.
Type "ping 192.168.1.61"
You might get reply in below format.
Pinging 192.168.1.61 [192.168.1.61] with 32 bytes of data:
Reply from 192.168.1.61: bytes=32 time=101ms TTL=124
If you don't get something in above format, then your MYSQL Server with ip 192.168.1.61 is NOT REACHABLE. Ask your team to start the server first. :(
If you have Linux version, open terminal and follow step 3.
Also check below link. Those might help you...
http://www.cyberciti.biz/tips/how-do-i-enable-remote-access-to-mysql-database-server.html
You should down load the jdbc driver and replace
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
by
Class.forName("com.mysql.jdbc.Driver");
If you still have issues asfter replacing Obdc stuff, please post the exception.
ALso check firewall settings and DB permissions.
If you'll get exception your app will not free system resources. This will work better:
} finally {
try {
rs.close();
st.close();
con.close();
} catch( Exception e ) {
e.printStackTrace();
}
}

Io exception: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=168821248)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4)))) error

Yesterday i was using oracle 9.1 with ojdbc 14 jdbc driver with following code for adding employee, it was working fine but now i am using oracle 10.1.0.2.0 with ojdbc14 but now it is giving following error
Io exception: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=168821248)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4)))) error
Following is code for adding employee
public static Connection getConnection() throws Exception {
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:#localhost:5500:globldb3";
String username = "scott";
String password = "tiger";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
public String addEmployee(){
Connection conn = null;
PreparedStatement pstmt = null;
boolean committed = false;
try {
conn = getConnection();
conn.setAutoCommit(false);
String query = "INSERT INTO
employee(e_id,e_name,e_f_name,e_desg,e_address,e_phone_no,"+
"e_salary,e_house_rent,e_conv_allow,e_email,d_name,e_hire_month,e_hire_year)"+
"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
pstmt = conn.prepareStatement(query);
pstmt = conn.prepareStatement(query); // create a statement
pstmt.setInt(1,this.eid);
pstmt.setString(2,this.ename);
pstmt.setString(3,this.efname);
pstmt.setString(4,this.edesg);
pstmt.setString(5,this.eaddress);
pstmt.setLong(6,this.ephoneno);
pstmt.setInt(7,this.esalary);
pstmt.setInt(8,this.houserent);
pstmt.setInt(9,this.convallow);
pstmt.setString(10,this.eemail);
pstmt.setString(11,this.edname);
pstmt.setInt(12,this.ehmon);
pstmt.setInt(13,this.ehy);
pstmt.executeUpdate(); // execute insert statement
conn.commit();
conn.setAutoCommit(true);
committed = true;
return "add-employee-msg.xhtml";
} catch (Exception e) {
e.printStackTrace();
return "add-employee-ex.xhtml";
} finally {
try{
if (!committed) conn.rollback();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
} //addEmployee
Any idea please?
That's a configuration issue:
12505, 00000, "TNS:listener does not currently know of SID given in connect descriptor"
Maybe you just have to copy the original LISTENER.ORA (correct name??) to your new oracle instance. You use the sid globldb3 which may be undefined on the 10.x instance.
You have wrong DB URL.
You have: "jdbc:oracle:thin:#localhost:5500:globldb3"
But should be: "jdbc:oracle:thin:#localhost:5500/globldb3" <- notice slash instead of colon for the SID name.
Due to wrong SID/Servicename this issue will arise. Based on Servicename/SID, need to correct DB URL, otherwise it will be showing Connection refused error.
format for both forms:
JDBC URL FORMAT:
jdbc:oracle:thin:#//:/ServiceName
or
jdbc:oracle:thin:#::
This should work :
<property name="connection.url">jdbc:oracle:thin:#//localhost:1521/ORCL</property>
JDBC URL FOR ORACLE, wrong or correct, how do you know?
INSTANCE SID by ":"
jdbc:oracle:thin:#db_ip_or_name:1521:ODB_IS
SERVICE NAME by "/"
jdbc:oracle:thin:#db_ip_or_name:1521/ODB_SN
How do you know?
SELECT NAME,VALUE,DESCRIPTION
FROM V$PARAMETER P
WHERE P.NAME IN ('db_unique_name','db_name','instance_name','service_names');
*maybe you need your dba's help to query data dictionary view
*----NAME-----|--VALUE--|--DESCRIPTION------------------------------
instance_name | ODB_IS | instance name supported by the instance
service_names | ODB_SN | service names supported by the instance
db_name | ODB_NM | database name specified in CREATE DATABASE
db_unique_name| ODB_UN | Database Unique Name
The defferents are for RAC, DG; PRD,UAT,DEV deployment requirement etc.
Use service_names = db_name as normal, they must been see in 'lsnrctl status'
PORT:
lsnrctl status
*run on the DB server shell window

Categories