Android ormlite 開啓事物


用了 ormlite來做orm mapping,感覺挺好用的,就一直在項目中用了,在數據量小的時候挺好的萬能的Dao接口的封裝。讓我用起來那是一個爽呀。。好日子總是的短暫的,服務器端的數據庫一下子增加了800條數據!!用dao.createOrUpdate方法就比較的悲劇了,要執行40s!!實在是不能忍受了!!然後就很自然的想到要開啓ormlite的事物了,可是上網上以找,找到一個,那裏用發現不好使,話說還是要看源碼比較的好。

找到了:

public Savepoint setSavePoint(String name) throws SQLException {
		try {
			db.beginTransaction();
			logger.trace("{}: save-point set with name {}", this, name);
			return new OurSavePoint(name);
		} catch (android.database.SQLException e) {
			throw SqlExceptionUtil.create("problems beginning transaction " + name, e);
		}
	}

看到:

db.beginTransaction();
是我想要的東西。

接下來還有:

public void commit(Savepoint savepoint) throws SQLException {
		try {
			db.setTransactionSuccessful();
			db.endTransaction();
			if (savepoint == null) {
				logger.trace("{}: transaction is successfuly ended", this);
			} else {
				logger.trace("{}: transaction {} is successfuly ended", this, savepoint.getSavepointName());
			}
		} catch (android.database.SQLException e) {
			throw SqlExceptionUtil.create("problems commiting transaction " + savepoint.getSavepointName(), e);
		}
	}

public void rollback(Savepoint savepoint) throws SQLException {
		try {
			// no setTransactionSuccessful() means it is a rollback
			db.endTransaction();
			if (savepoint == null) {
				logger.trace("{}: transaction is ended, unsuccessfuly", this);
			} else {
				logger.trace("{}: transaction {} is ended, unsuccessfuly", this, savepoint.getSavepointName());
			}
		} catch (android.database.SQLException e) {
			throw SqlExceptionUtil.create("problems rolling back transaction " + savepoint.getSavepointName(), e);
		}

看到這個寫個方法,問題就基本上解決了。


AndroidDatabaseConnection connection = null;
				String pointName = "pointName";
				Savepoint savepoint = null;
				try
				{
					DebugTool.info ( "@@@@@@@@@@@@@@@@@@@@updateFooodTable= " + CommonUtil.getCurrentTime () );
					// // beging transaction
						 
						connection = new AndroidDatabaseConnection ( BaseApplication.SQLiteAccess ()
									.getHelper ( BaseApplication.mAppContext ).getWritableDatabase () , true );
//						connection.setAutoCommit ( false );
						dao.setAutoCommit ( connection , false );
//						dao.startThreadConnection ();
						 savepoint = connection.setSavePoint ( pointName );
					for ( Food food : foodList )
					{
						try
						{

							dao.createOrUpdate ( food );
						}
						catch ( SQLException e )
						{
							DebugTool
									.info ( "<!=============updateFooodTable===========SQLException============>" );
						}
						catch ( Exception e )
						{
							DebugTool
									.info ( "<!=============updateFooodTable===========Exception================>" );
						}
					}

					 ///foodcookmethods
//					connection.commit ( null );
					
//					dao.commit ( connection );
					connection.commit ( savepoint );
					DebugTool.info ( "@@@@@@@@@@@@@@@@@@@@updateFooodTable= " + CommonUtil.getCurrentTime () );
					
				}
				catch ( SQLException e )
				{
					DebugTool
					.error ( "<!===updateFooodTable====>" ,e);
					try
					{
						connection.rollback ( savepoint );
					}
					catch ( SQLException e1 )
					{
						DebugTool
						.error ( "<!===updateFooodTable++rollback=SQLException===>" ,e1);
					}
				}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章