【发布时间】:2012-05-12 16:31:31
【问题描述】:
我需要从我的 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)
非常感谢任何帮助。
【问题讨论】:
-
请将您的数据库包装在 Web 服务中,并在 Android 中使用该服务。 JDBC 不适用于您在移动设备上发现的那种不可靠的网络连接。
-
非常感谢您的回答!我已经考虑过使用 HTML 来处理请求和响应,但我想目前这是不可能的,因为我们没有时间这样做。如果我们谈论移动设备,为什么网络连接不可靠? JDBC 有什么问题使它不适合此类任务?而且,最重要的是,我能否以某种方式从 Android 建立到 MySQL 的池连接?
-
“如果我们谈论移动设备,为什么网络连接不可靠?” ——移动设备是移动的。用户脱离 WiFi 并故障转移到移动数据,或再次翻转。用户蜿蜒进入移动数据信号较差的地方。等等。 “JDBC 有什么问题使它不适合此类任务?” -- JDBC 大约有 15 年的历史,是围绕稳定的 LAN 连接设计的(我也不会在 Internet 上使用它)。 “我能以某种方式从 Android 建立到 MySQL 的池连接吗?” -- 我不知道,如果他们为我工作,我会解雇任何尝试过的人。
-
当然是这样的。但是在我正在开发的应用程序的上下文中,它有点不同。我们组织了一个 WiFi 网络,并声明我们的应用程序(只是一个更大的综合体的一部分)仅在它存在的情况下工作(并且客户同意这一点)。我是否正确地将数据库包装在 Web 服务中?您的意思是应用程序以 HTML 格式发送请求并以相同的方式获得响应?
-
“我们组织了一个 WiFi 网络并声明我们的应用程序(只是一个更大的综合体的一部分)仅在它存在的情况下工作(并且客户同意这一点)。” ——嗯,好的。 “你的意思是应用程序以 HTML 格式发送请求并以相同的方式获得响应?” -- 不,我的意思是 Web 服务 -- en.wikipedia.org/wiki/Web_service REST,以及在较小程度上的 SOA,在 Android 上运行得最好,仅仅是因为 Android 缺少内置的 SOAP 端点。
标签: android mysql connection-pooling