S
Swapnil Kale
Hi,
I've written a custom odbc driver to execute some complex queries
using Tomcat Server.
MS ACCESS loads the dll (through system DSN) I created and links the
table to oracle using my odbc drier.
The problem:
Inside the dll I'm creating a jvm which talks to the tomcat server.
When I run a sample application locally it works just fine (in the
sense, the jvm gets created and connection to tomcat etc etc.)
But when I try to run it through ODBC bridge, the dll is not able to
create the JVM:
It throws an exception :
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x10004e86, pid=4184,
tid=4716
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0-b64 mixed mode)
# Problematic frame:
# C [aces_odbc_driver.dll+0x4e86]
#
Stack: [0x00040000,0x00080000), sp=0x0007ecf0, free space=251k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code,
C=native code)
C [aces_odbc_driver.dll+0x4e86]
C [aces_odbc_driver.dll+0x1ad2d]
C [ODBC32.dll+0x9260]
C [ODBC32.dll+0x3004]
C [ODBC32.dll+0x2fbc]
C [ODBC32.dll+0x328f9]
C [JdbcOdbc.dll+0x4c6d]
j sun.jdbc.odbc.JdbcOdbc.driverConnect(J[B[B)V+0
j sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JLjava/lang/StringV+93
j sun.jdbc.odbc.JdbcOdbcConnection.initialize(Ljava/lang/String;Ljava/
util/Properties;I)V+984
j sun.jdbc.odbc.JdbcOdbcDriver.connect(Ljava/lang/String;Ljava/util/
PropertiesLjava/sql/Connection;+129
j java.sql.DriverManager.getConnection(Ljava/lang/String;Ljava/util/
Properties;Ljava/lang/ClassLoaderLjava/sql/Connection;+165
j java.sql.DriverManager.getConnection(Ljava/lang/String;Ljava/lang/
String;Ljava/lang/StringLjava/sql/Connection;+41
j SimpleSelect.main([Ljava/lang/StringV+23
I' was trying to use a simple java program to test the functionality.
Here is the sample java code.
import java.net.URL;
import java.sql.*;
class SimpleSelect {
public static void main (String args[]) {
String url = "jdbcdbc:aptest";
String query = "SELECT * FROM emp";
try {
// Load the jdbc-odbc bridge driver
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
DriverManager.setLogStream(System.out);
// Attempt to connect to a driver. Each one
// of the registered drivers will be loaded until
// one is found that can process this URL
Connection con = DriverManager.getConnection (
url, "abc", "abc");
// If we were unable to connect, an exception
// would have been thrown. So, if we get here,
// we are successfully connected to the URL
<Here is the code in the myodbc dll for which the DSN is created>
typedef _JNI_IMPORT_OR_EXPORT_ jint (JNICALL *JNI_JVMPROC) (JavaVM
**,void **,void *);
JNI_JVMPROC ProcAdd;
if(env == NULL || jvm == NULL)
{
options[0].optionString = "-Djava.class.path="required path given
for jars"
// options[1].optionString = "-verbose:jni";
vm_args.version = JNI_VERSION_1_2;
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.ignoreUnrecognized = JNI_TRUE;
// JNI_GetDefaultJavaVMInitArgs(&vm_args);
if (!getcwd(buffer, 512)) { /* returns null if path is too long */
cout << "Path name is too long \n" ;
}
else {
cout << "Current Working Directory is " << buffer;
}
cout << "\n\n**************Loading jvm.dll library****************\n
\n";
hinstLib = LoadLibrary("jvm.dll");
if (hinstLib == NULL)
{
cout << "\n\n**************Failed Loading jvm.dll
library****************\n\n";
}
ProcAdd = (JNI_JVMPROC) GetProcAddress(hinstLib,
"JNI_CreateJavaVM");
if(ProcAdd != NULL ) {
cout << "------------Proc address got is : --------" << ProcAdd;
}
res = (ProcAdd) (&jvm,(void**)&env,&vm_args);
//res = JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);
cout <<res;
if (res < 0)
{
cerr<< "\n\n Can't create Java VM FROM Swapnil" << endl;
if (env->ExceptionOccurred())
{
env->ExceptionDescribe();
env->ExceptionClear();
}
cout<< "Destroying JVM" << endl;
jvm->DestroyJavaVM();
}
}
I tried using the simple way of creating the jvm also but didn't work
out. The same code works when I load the dll directly in a sample
program
I checked the path , environment variables as well. The only problem
is jvm is not created when I try to invoke it from dll through
ODBC32.dll
Any help would be appreciated.
I've written a custom odbc driver to execute some complex queries
using Tomcat Server.
MS ACCESS loads the dll (through system DSN) I created and links the
table to oracle using my odbc drier.
The problem:
Inside the dll I'm creating a jvm which talks to the tomcat server.
When I run a sample application locally it works just fine (in the
sense, the jvm gets created and connection to tomcat etc etc.)
But when I try to run it through ODBC bridge, the dll is not able to
create the JVM:
It throws an exception :
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x10004e86, pid=4184,
tid=4716
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0-b64 mixed mode)
# Problematic frame:
# C [aces_odbc_driver.dll+0x4e86]
#
Stack: [0x00040000,0x00080000), sp=0x0007ecf0, free space=251k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code,
C=native code)
C [aces_odbc_driver.dll+0x4e86]
C [aces_odbc_driver.dll+0x1ad2d]
C [ODBC32.dll+0x9260]
C [ODBC32.dll+0x3004]
C [ODBC32.dll+0x2fbc]
C [ODBC32.dll+0x328f9]
C [JdbcOdbc.dll+0x4c6d]
j sun.jdbc.odbc.JdbcOdbc.driverConnect(J[B[B)V+0
j sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JLjava/lang/StringV+93
j sun.jdbc.odbc.JdbcOdbcConnection.initialize(Ljava/lang/String;Ljava/
util/Properties;I)V+984
j sun.jdbc.odbc.JdbcOdbcDriver.connect(Ljava/lang/String;Ljava/util/
PropertiesLjava/sql/Connection;+129
j java.sql.DriverManager.getConnection(Ljava/lang/String;Ljava/util/
Properties;Ljava/lang/ClassLoaderLjava/sql/Connection;+165
j java.sql.DriverManager.getConnection(Ljava/lang/String;Ljava/lang/
String;Ljava/lang/StringLjava/sql/Connection;+41
j SimpleSelect.main([Ljava/lang/StringV+23
I' was trying to use a simple java program to test the functionality.
Here is the sample java code.
import java.net.URL;
import java.sql.*;
class SimpleSelect {
public static void main (String args[]) {
String url = "jdbcdbc:aptest";
String query = "SELECT * FROM emp";
try {
// Load the jdbc-odbc bridge driver
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
DriverManager.setLogStream(System.out);
// Attempt to connect to a driver. Each one
// of the registered drivers will be loaded until
// one is found that can process this URL
Connection con = DriverManager.getConnection (
url, "abc", "abc");
// If we were unable to connect, an exception
// would have been thrown. So, if we get here,
// we are successfully connected to the URL
<Here is the code in the myodbc dll for which the DSN is created>
typedef _JNI_IMPORT_OR_EXPORT_ jint (JNICALL *JNI_JVMPROC) (JavaVM
**,void **,void *);
JNI_JVMPROC ProcAdd;
if(env == NULL || jvm == NULL)
{
options[0].optionString = "-Djava.class.path="required path given
for jars"
// options[1].optionString = "-verbose:jni";
vm_args.version = JNI_VERSION_1_2;
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.ignoreUnrecognized = JNI_TRUE;
// JNI_GetDefaultJavaVMInitArgs(&vm_args);
if (!getcwd(buffer, 512)) { /* returns null if path is too long */
cout << "Path name is too long \n" ;
}
else {
cout << "Current Working Directory is " << buffer;
}
cout << "\n\n**************Loading jvm.dll library****************\n
\n";
hinstLib = LoadLibrary("jvm.dll");
if (hinstLib == NULL)
{
cout << "\n\n**************Failed Loading jvm.dll
library****************\n\n";
}
ProcAdd = (JNI_JVMPROC) GetProcAddress(hinstLib,
"JNI_CreateJavaVM");
if(ProcAdd != NULL ) {
cout << "------------Proc address got is : --------" << ProcAdd;
}
res = (ProcAdd) (&jvm,(void**)&env,&vm_args);
//res = JNI_CreateJavaVM(&jvm,(void**)&env,&vm_args);
cout <<res;
if (res < 0)
{
cerr<< "\n\n Can't create Java VM FROM Swapnil" << endl;
if (env->ExceptionOccurred())
{
env->ExceptionDescribe();
env->ExceptionClear();
}
cout<< "Destroying JVM" << endl;
jvm->DestroyJavaVM();
}
}
I tried using the simple way of creating the jvm also but didn't work
out. The same code works when I load the dll directly in a sample
program
I checked the path , environment variables as well. The only problem
is jvm is not created when I try to invoke it from dll through
ODBC32.dll
Any help would be appreciated.