在android中建立与MySQL的池连接

时间:2012-05-12 16:31:31

标签: android mysql connection-pooling

我需要从我的Android应用程序访问MySQL数据库。现在所有工作都是通过

完成的
DriverManager.getConnection(url);

等等。但我必须从多个线程访问数据库,所以我必须使用连接池。

问题1.是

com.mysql.jdbc.jdbc2.optional.MysqlDataSource ds = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource();

创建数据源的正确方法?

问题2.如果我写上一行代码,我的应用程序编译并安装在设备(而不是模拟器)上,但我得到一个奇怪的

java.lang.NoClassDefFoundError: com.mysql.jdbc.jdbc2.optional.MysqlDataSource`

,我无法使用try / catch处理程序:

try
{
com.mysql.jdbc.jdbc2.optional.MysqlDataSource a = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource();
}
catch (Exception e)
{
I don't get here. The app just crashes, as if I had no try/catch block.
}

问题3.我将mysql-connector-java-5.1.20-bin.jar复制到设备并编写了以下代码:

try
{
final String str = Environment.getExternalStorageState();
final File sd = getActivity().getExternalFilesDir(null);
final File file = new File(sd, "mysql-connector-java-5.1.20-bin.jar");

boolean b = file.exists();

final URLClassLoader cl = URLClassLoader.newInstance(new URL[] {file.toURI().toURL()} );
cl.loadClass("com.mysql.jdbc.jdbc2.optional.MysqlDataSource"); //$NON-NLS-1$
}

catch (Exception e)
{
new AlertDialog.Builder(getActivity())
.setMessage(ObjectConverter.throwable2String(e))
.show();
}

找到了文件,但

cl.loadClass()

失败
java.lang.NullPointerException
at java.net.URLClassLoader.getPermissions(URLClassLoader.java:614)
at java.security.SecureClassLoader.getPD(SecureClassLoader.java:140)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:93)
at java.net.URLClassLoader.access$600(URLClassLoader.java:55)
at java.net.URLClassLoader$URLJarHandler.createClass(URLClassLoader.java:364)
at java.net.URLClassLoader$URLJarHandler.findClass(URLClassLoader.java:303)
at java.net.URLClassLoader.findClass(URLClassLoader.java:748)
at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
at ru.mypkg.myapp.func(myapp.java:367)
at android.view.View.performClick(View.java:3511)
at android.view.View$PerformClick.run(View.java:14110)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

这个问题已经有6年了,马克是正确的,几乎在你能想到的每一个场景中,Android上的JDBC和在浴室中使用烤面包机一样明智。然而,有时我们做事是因为我们可以而不是因为我们必然应该,而且今天我有理由想要这样做(对于在不寻常的环境中运行的特定的非常小的应用程序),这就是我发现这个问题的方式。

首先解决NoClassDefFoundErrorcatch阻止它未被捕获的原因是因为它是Error而不是ExceptionErrorException都继承自Throwable,因此您可以抓住它:

catch (Throwable t)
{
    // This will catch NoClassDefFoundError
}

我认为它不能MySqlDataSource它无法找到,但它所依赖的类或接口之一 - 在我看来是javax.naming.Referenceable。 Android没有提供javax.naming软件包,因此尝试使用Connector / J JDBC驱动程序的池功能并不能让你走得太远(你可以尝试提供缺少的依赖项)但这条路可能导致疯狂。)

相反,您可能会在第三方连接池实施方面获得更多好运。这样做有各种Java库。其中一些将在Android上运行。我已经验证的工作是HikariCP。有关于配置here的说明,特别是对于MySQL,here