我的DBDA类

本文介绍了一个PHP类,该类使用MySQLi扩展来执行数据库操作。包括执行SQL语句并返回不同格式结果的方法,如二维数组、关联数组及字符串形式。
<?php
class DBDA
{
	public $host="localhost";
	public $uid="root";
	public $pwd="root";
	public $dbname="club";
	
	/**
	*给一个sql语句,返回执行的结果
	*@param string $sql 用户指定的sql语句
	*@param int $type 用户给的语句类型,0代表增删改,1代表查询
	*@return  返回查询的结果,如果是查询返回二维数组,如果是增删改返回true或false 
	*/
	function Query($sql,$type=1)
	{
		//造连接对象
		$db = new MySQLi($this->host,$this->uid,$this->pwd,$this->dbname);
		
		//执行sql语句
		$reslut = $db->query($sql);
		
		//从结果集对象里面取数据
		if($type==1)
		{
			return $reslut->fetch_all();
		}
		else
		{
			return $reslut;
		}
	}
	
	/**
	*给一个sql语句,返回关联的二维数组
	*@param string $sql 用户指定的sql语句
	*@param int $type 用户给的语句类型,0代表增删改,1代表查询
	*@return  返回查询的结果,如果是查询返回二维数组,如果是增删改返回true或false 
	*/
	function GuanQuery($sql,$type=1)
	{
		//造连接对象
		$db = new MySQLi($this->host,$this->uid,$this->pwd,$this->dbname);
		
		//执行sql语句
		$reslut = $db->query($sql);
		
		//取数据
		if($type==1)
		{
			$attr = array();
			while($a = $reslut->fetch_assoc())
			{
				$attr[] = $a;
			}
			
			return $attr;	
		}
		else
		{
			return $reslut;
		}
	}
	/**
	*给一个sql语句,返回字符串
	*@param string $sql 用户指定的sql语句
	*@param int $type 用户给的语句类型,0代表增删改,1代表查询
	*@return  返回查询的结果,如果是查询返回字符串,如果是增删改返回true或false 
	*/
	function StrQuery($sql,$type=1)
	{
		//造连接对象
		$db = new MySQLi($this->host,$this->uid,$this->pwd,$this->dbname);
		
		//执行sql语句
		$reslut = $db->query($sql);
		
		//取数据
		if($type==1)
		{
			$attr = $reslut->fetch_all();
			$str="";
			foreach($attr as $v)
			{
				$str .= implode("^",$v);
				$str .="|";
			}
			return substr($str,0,strlen($str)-1);
		}
		else
		{
			return $reslut;
		}
	}
}

  

转载于:https://www.cnblogs.com/li1056822533/p/6780028.html

"AudioDeviceBroker" prio=5 tid=269 Native | group="main" sCount=1 ucsCount=0 flags=1 obj=0x15dbda88 self=0xb400006f104ddc00 | sysTid=3834 nice=0 cgrp=ssfg sched=0/0 handle=0x6ee5368730 | state=S schedstat=( 17562474805 123265317766 74287 ) utm=770 stm=985 core=6 HZ=100 | stack=0x6ee5265000-0x6ee5267000 stackSize=1037KB | held mutexes= native: #00 pc 000f522c /apex/com.android.runtime/lib64/bionic/libc.so (__ioctl+12) (BuildId: 4545a63f7d7b92b0c45c26fe530b66de) native: #01 pc 0009c270 /apex/com.android.runtime/lib64/bionic/libc.so (ioctl+156) (BuildId: 4545a63f7d7b92b0c45c26fe530b66de) native: #02 pc 0006c454 /system/lib64/libbinder.so (android::IPCThreadState::transact+960) (BuildId: 217d4a46760a940dfed21538f547262d) native: #03 pc 00068ba0 /system/lib64/libbinder.so (android::BpBinder::transact+312) (BuildId: 217d4a46760a940dfed21538f547262d) native: #04 pc 0001da50 /system/lib64/audiopolicy-aidl-cpp.so (android::media::BpAudioPolicyService::getDevicesForAttributes+696) (BuildId: 42f83b19a621bcae5536880c786c936d) native: #05 pc 00088738 /system/lib64/libaudioclient.so (android::AudioSystem::getDevicesForAttributes +444) (BuildId: a6d2e3ce322b5093795988d6bdcbb7a3) native: #06 pc 001cc838 /system/lib64/libandroid_runtime.so (android_media_AudioSystem_getDevicesForAttributes+148) (BuildId: 6d7e714f27c64d116b394790bf83a011) at android.media.AudioSystem.getDevicesForAttributes(Native method) at android.media.AudioSystem.getDevicesForAttributes(AudioSystem.java:1953) at com.android.server.audio.AudioSystemAdapter.getDevicesForAttributesImpl(AudioSystemAdapter.java:342) - locked <0x029e90fd> (a java.lang.Object)查找到最后发现是这段代码,意思是线程168被AudioDeviceBroker锁住了吗,怎么理解,详细解释一下
07-04
<think>我们分析这个堆栈信息,重点是理解线程状态和锁的关系。堆栈信息显示:线程名称:"AudioDeviceBroker" tid=269状态:state=S(Sleeping)持有的互斥锁:heldmutexes=(这里为空,表示当前没有持有任何互斥锁?)但是,在堆栈的底部,我们看到:at com.android.server.audio.AudioSystemAdapter.getDevicesForAttributesImpl(AudioSystemAdapter.java:342)-locked <0x029e90fd> (a java.lang.Object)这里明确表示在getDevicesForAttributesImpl方法中,锁住了一个对象(0x029e90fd)。然而,这个锁是在Java层的锁。现在,问题描述是:主线程阻塞,等待线程269的锁。但是从这个堆栈看,线程269(即AudioDeviceBroker线程)并没有显示持有其他锁,而是在Java层持有锁0x029e90fd。我们需要理解:1.线程269当前正在执行什么?从堆栈看,它正在通过binder调用(transact)去获取设备属性(getDevicesForAttributes),并且在AudioSystemAdapter中已经持有了一个锁(0x029e90fd)。2.主线程在等待什么?如果主线程在等待线程269释放某个锁,那么可能是线程269持有这个锁,而主线程想要获取同一个锁。但是,注意堆栈中线程269的状态是S(Sleeping),它可能在等待binder调用的返回(即阻塞在binder调用上)。而它持有的Java锁(0x029e90fd)并没有释放,因为它在等待binder返回的过程中,还没有执行到释放锁的代码。因此,我们可以推断: -线程269在进入getDevicesForAttributesImpl方法时,先获取了锁(0x029e90fd),然后调用了native方法(最终通过binder调用去获取设备信息),此时线程269在binder调用上阻塞(等待返回),所以它处于Sleeping状态,但并没有释放已经持有的锁(0x029e90fd)。-主线程可能也需要获取同一个锁(0x029e90fd),因此被阻塞,等待线程269释放该锁。所以,当线程269的binder调用返回后,它会继续执行,然后退出getDevicesForAttributesImpl方法的作用域,从而释放锁(0x029e90fd)。一旦这个锁被释放,主线程(以及其他等待这个锁的线程)就可以获取这个锁,从而继续执行。总结:1.线程269持有Java锁(0x029e90fd),并在等待binder返回(所以处于Sleeping状态)。2.主线程因为尝试获取同一个Java锁(0x029e90fd)而被阻塞。3.当线程269的binder调用返回后,它会继续执行,然后释放锁,主线程就会获得锁并继续执行。注意:这里线程269在等待binder返回时并没有释放锁,这可能是设计上的问题,因为它持有锁的时间过长(包括IO等待时间),容易导致其他线程长时间阻塞。理想情况下,锁的持有时间应尽可能短,避免在持有锁时进行耗时操作(如IO或跨进程调用)。因此,解决这问题的方法可能是:-重新设计锁的粒度,避免在持有锁时进行跨进程调用。-或者使用异步调用的方式,在调用前先释放锁,等返回后再重新获取锁并处理结果(但这样可能改变执行顺序,需要谨慎)。现在,针对问题:主线程在等待线程269释放锁(0x029e90fd),当线程269完成binder调用并继续执行到方法结束(或者离开同步块)时,就会释放锁,主线程就会获得锁并继续执行。所以,答案是:是的,当线程269使用完共享资源(即离开同步块)把锁释放后,主线程就不阻塞了。但是,这里线程269使用共享资源的时间包括了binder调用的时间,这可能是导致主线程长时间阻塞的原因。因此,需要关注这个锁的设计是否合理。</think>### "AudioDeviceBroker"线程阻塞问题解析 #### 堆栈关键信息解读 1. **线程状态** - `state=S`:表示线程处于休眠状态(Sleeping) - `held mutexes=`:**未持有任何互斥锁**(此处为空) - `- locked <0x029e90fd>`:在Java层持有对象锁(非系统级互斥锁) 2. **阻塞位置** ```java at com.android.server.audio.AudioSystemAdapter.getDevicesForAttributesImpl - locked <0x029e90fd> (a java.lang.Object) ``` 表示线程在`getDevicesForAttributesImpl`方法内持有对象锁`0x029e90fd` #### 阻塞原因分析 ```mermaid graph TB A[主线程] -->|请求音频设备| B(AudioDeviceBroker线程) B --> C[进入getDevicesForAttributesImpl] C --> D[获取对象锁0x029e90fd] D --> E[发起Binder调用] E -->|阻塞等待| F[libbinder.so的transact] F -->|内核级阻塞| G[__ioctl系统调用] ``` 1. **锁持有与阻塞** - 线程269(AudioDeviceBroker)**持有Java对象锁**,但**未持有系统互斥锁** - 阻塞发生在`__ioctl`系统调用,等待Binder跨进程通信返回 2. **关键矛盾点** - 日志显示主线程"在等线程269的锁":实际是等**Java对象锁**(0x029e90fd) - 线程269当前阻塞在Binder调用,**尚未释放该Java锁** #### 完整执行流程 1. **线程269执行路径** ```java synchronized(lockObject) { // 获取锁0x029e90fd AudioSystem.getDevicesForAttributes() // 发起Native调用 → libaudioclient.so → libbinder.so → __ioctl() // 在此阻塞等待响应 } // 离开同步块才会释放锁 ``` 2. **主线程阻塞原因** - 当主线程尝试进入相同同步块时: ```java synchronized(lockObject) { // 等待线程269释放0x029e90fd // 被阻塞在此 } ``` #### 解决方案 1. **解除阻塞条件** - 线程269完成Binder调用 → 继续执行 → 退出同步块 → **自动释放锁0x029e90fd** - 此时主线程才能获取该锁并继续执行 2. **优化建议** ```java // 避免在同步块内进行IO操作 Object data = null; synchronized(lockObject) { data = fetchData(); // 仅保存需要保护的数据 } processData(data); // 耗时操作放在同步块外 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值