Den här frågan är 6 år gammal och Mark har rätt i att JDBC på Android i nästan alla scenarion du kan tänka dig är ungefär lika vettigt som att försöka använda en brödrost i badet. Men ibland gör vi saker för att vi kan och inte för att vi nödvändigtvis borde, och idag hade jag en berättigad anledning att vilja göra detta (för en specifik mycket nischad app som körs i en ovanlig miljö), vilket är hur jag hittade den här frågan.
Adressering av NoClassDefFoundError
För det första, anledningen till att den inte fångas av catch
blocket beror på att det är ett Error
inte ett Exception
. Båda Error
och Exception
ärva från Throwable
, så du kan fånga det istället:
catch (Throwable t)
{
// This will catch NoClassDefFoundError
}
Jag tror att det inte är MySqlDataSource
som den inte kan hitta, men en av klasserna eller gränssnitten som den beror på - i mitt fall var det javax.naming.Referenceable
. Android tillhandahåller inte javax.naming
paketet, så att försöka använda poolningsfunktionerna i Connector/J JDBC-drivrutinen för MySQL kommer inte att ta dig särskilt långt (du kan försöka tillhandahålla de saknade beroenden men den vägen leder sannolikt till galenskap).
Istället kommer du förmodligen att ha mer tur med en tredjeparts anslutningspoolimplementering. Det finns olika Java-bibliotek för att göra detta. Vissa av dem kommer att fungera på Android. En som jag har verifierat fungerar är HikariCP . Det finns instruktioner för hur du konfigurerar den här och, specifikt för MySQL, här .