Установить пул соединение с MySQL в Android

Мне нужно получить доступ к базе данных MySQL из моего приложения для Android. Теперь вся работа выполнена

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 ответ

Этому вопросу 6 лет, и Марк прав, что почти во всех сценариях, о которых вы можете подумать, JDBC на Android примерно такой же разумный, как и попытка использовать тостер в ванной. Однако иногда мы делаем что-то, потому что можем, а не потому, что обязательно должны, и сегодня у меня была веская причина хотеть сделать это (для конкретного очень нишевого приложения, работающего в необычной среде), и именно так я нашел этот вопрос.

Обращаясь к NoClassDefFoundError во-первых, причина, по которой catch блок, потому что это Error не Exception, И то и другое Error а также Exception наследовать от Throwable, так что вы можете поймать это вместо этого:

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

Я считаю что это не MySqlDataSource что он не может найти, но один из классов или интерфейсов, от которых он зависит - в моем случае это был javax.naming.Referenceable, Android не предоставляет javax.naming Таким образом, попытка использовать функции пула драйвера JDBC Connector / J для MySQL не поможет вам продвинуться далеко (вы можете попытаться предоставить недостающие зависимости, но эта дорога, вероятно, приведет к безумию).

Вместо этого вам, вероятно, повезет больше со сторонней реализацией пула соединений. Для этого есть различные библиотеки Java. Некоторые из них будут работать на Android. Тот, который я проверил, работает, это HikariCP. Здесь есть инструкции по его настройке и, в частности, для MySQL.

Другие вопросы по тегам